L'istruzione utilizza ciò che viene chiamato "elaborazione per gruppo". Prima che il passaggio possa essere eseguito, è necessario che i dati siano ordinati per btn wtn resp_ji
.
Il first.resp_ji
pezzo sta verificando se è la prima volta che vede il valore corrente di resp_ji all'interno della combinazione btn/wtn corrente. Allo stesso modo il last.resp_ji
pezzo sta controllando se è l'ultima volta che vedrà il valore corrente di resp_ji
all'interno dell'attuale combinazione btn/wtn.
Combinando il tutto insieme la dichiarazione:
if not (first.resp_ji and last.resp_ji);
Sta dicendo, se il valore corrente di resp_ji si verifica più volte per la combinazione corrente di btn/wtn, allora mantieni il record, altrimenti scarta il record. Il comportamento di if
istruzione se usata in questo modo mantiene/elimina implicitamente il record.
Per fare l'equivalente in SQL, potresti fare qualcosa come:
- Trova tutti i record da eliminare.
- Elimina quei record dal set di dati originale.
Allora...
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
MODIFICA :Dovrei menzionare che non esiste un semplice equivalente SQL. Potrebbe essere possibile numerando le righe nelle sottoquery e quindi costruendo la logica in aggiunta a ciò, ma sarebbe brutto. Può anche dipendere dal tipo specifico di SQL utilizzato.