De verklaring maakt gebruik van wat 'door groepsverwerking' wordt genoemd. Voordat de stap kan worden uitgevoerd, moeten de gegevens worden gesorteerd op btn wtn resp_ji
.
De first.resp_ji
piece controleert of het de eerste keer is dat het de huidige waarde van resp_ji binnen de huidige btn/wtn-combinatie ziet. Evenzo de last.resp_ji
stuk controleert of het de laatste keer is dat het de huidige waarde van resp_ji
ziet binnen de huidige btn/wtn combinatie.
Combineer het allemaal met de verklaring:
if not (first.resp_ji and last.resp_ji);
Zegt, als de huidige waarde van resp_ji meerdere keren voorkomt voor de huidige combinatie van btn/wtn, bewaar dan het record, anders gooi het record weg. Het gedrag van de if
verklaring bij gebruik als dat impliciet de record bewaart/verwijdert.
Om het equivalent in SQL te doen, zou je zoiets kunnen doen:
- Vind alle records om te verwijderen.
- Gooi die records weg uit de oorspronkelijke dataset.
Dus...
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
BEWERKEN :Ik moet vermelden dat er geen eenvoudig SQL-equivalent is. Het is misschien mogelijk door rijen in subquery's te nummeren en daar logica op te bouwen, maar het zou lelijk zijn. Het kan ook afhangen van de specifieke smaak van SQL die wordt gebruikt.