Uttalandet använder vad som kallas "genom gruppbearbetning". Innan steget kan köras kräver det att data sorteras efter btn wtn resp_ji
.
first.resp_ji
piece kontrollerar för att se om det är första gången det ses det aktuella värdet av resp_ji inom den aktuella btn/wtn-kombinationen. Likaså last.resp_ji
piece kontrollerar om det är sista gången som det kommer att se det aktuella värdet för resp_ji
inom den aktuella btn/wtn-kombinationen.
Kombinera det hela tillsammans uttalandet:
if not (first.resp_ji and last.resp_ji);
Jag säger att om det aktuella värdet av resp_ji inträffar flera gånger för den aktuella kombinationen av btn/wtn, behåll posten, annars kasta posten. Beteendet för if
uttalande när den används på det sättet behåller/slänger posten underförstått.
För att göra motsvarande i SQL kan du göra något i stil med:
- Hitta alla poster att kassera.
- Kassera dessa poster från den ursprungliga datamängden.
Så...
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
REDIGERA :Jag bör nämna att det inte finns någon enkel SQL-motsvarighet. Det kan vara möjligt genom att numrera rader i underfrågor och sedan bygga logik ovanpå det, men det skulle vara fult. Det kan också bero på den specifika smaken av SQL som används.