Udsagnet bruger det, der kaldes 'ved gruppebehandling'. Før trinnet kan køre, kræver det, at dataene er sorteret efter btn wtn resp_ji
.
first.resp_ji
piece tjekker for at se, om det er første gang, det er set den aktuelle værdi af resp_ji i den aktuelle btn/wtn-kombination. Ligeledes last.resp_ji
piece tjekker, om det er sidste gang, det vil se den aktuelle værdi af resp_ji
inden for den aktuelle btn/wtn kombination.
Ved at kombinere det hele sammen udsagnet:
if not (first.resp_ji and last.resp_ji);
Siger, hvis den aktuelle værdi af resp_ji forekommer flere gange for den aktuelle kombination af btn/wtn, så behold posten, ellers kasser posten. Opførselen af if
sætning, når den bruges på den måde, beholder/kasserer posten implicit.
For at gøre det tilsvarende i SQL, kan du gøre noget som:
- Find alle poster, der skal kasseres.
- Kassér disse poster fra det originale datasæt.
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
REDIGER :Jeg bør nævne, at der ikke er nogen simpel SQL-ækvivalent. Det kan være muligt ved at nummerere rækker i underforespørgsler og derefter bygge logik oven i det, men det ville være grimt. Det kan også afhænge af den specifikke smag af SQL, der bruges.