La declaración está usando lo que se llama 'procesamiento por grupo'. Antes de que se pueda ejecutar el paso, se requiere que los datos estén ordenados por btn wtn resp_ji
.
El first.resp_ji
piece está comprobando si es la primera vez que ve el valor actual de resp_ji dentro de la combinación btn/wtn actual. Del mismo modo el last.resp_ji
la pieza está comprobando si es la última vez que verá el valor actual de resp_ji
dentro de la combinación btn/wtn actual.
Combinando todo junto la declaración:
if not (first.resp_ji and last.resp_ji);
Es decir, si el valor actual de resp_ji ocurre varias veces para la combinación actual de btn/wtn, mantenga el registro; de lo contrario, deséchelo. El comportamiento del if
declaración cuando se usa así implícitamente mantiene/descarta el registro.
Para hacer el equivalente en SQL, podría hacer algo como:
- Buscar todos los registros para descartar.
- Descarta esos registros del conjunto de datos original.
Entonces...
create table rows_to_discard as
select btn, wtn, resp_ji, count(*) as freq
from mytable
group by btn, wtn, resp_ji
having count(*) = 1
create table want as
select a.*
from mytable a
left join rows_to_discard b on b.btn = a.btn
and b.wtn = a.wtn
and b.resp_ji = a.resp_ji
where b.btn is null
EDITAR :Debo mencionar que no existe un equivalente SQL simple. Puede ser posible numerando las filas en las subconsultas y luego creando una lógica además de eso, pero sería horrible. También puede depender del tipo específico de SQL que se utilice.