A instrução está usando o que é chamado de 'processamento por grupo'. Antes que a etapa possa ser executada, ela exige que os dados sejam classificados por
btn wtn resp_ji
. O
first.resp_ji
peça está verificando se é a primeira vez que vê o valor atual de resp_ji dentro da combinação btn/wtn atual. Da mesma forma, o last.resp_ji
peça está verificando se é a última vez que verá o valor atual de resp_ji
dentro da combinação btn/wtn atual. Combinando tudo, a declaração:
if not (first.resp_ji and last.resp_ji);
Está dizendo que, se o valor atual de resp_ji ocorrer várias vezes para a combinação atual de btn/wtn, mantenha o registro, caso contrário, descarte o registro. O comportamento do
if
quando usado assim implicitamente mantém/descarta o registro. Para fazer o equivalente em SQL, você poderia fazer algo como:
- Encontre todos os registros para descartar.
- Descarte esses registros do conjunto de dados original.
Então...
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 :devo mencionar que não existe um equivalente SQL simples. Pode ser possível numerar linhas em subconsultas e, em seguida, criar lógica em cima disso, mas seria difícil. Também pode depender do tipo específico de SQL que está sendo usado.