Oświadczenie używa tego, co nazywa się „przetwarzaniem grupowym”. Przed uruchomieniem kroku wymagane jest posortowanie danych według btn wtn resp_ji
.
first.resp_ji
piece sprawdza, czy po raz pierwszy widzi bieżącą wartość resp_ji w bieżącej kombinacji btn/wtn. Podobnie last.resp_ji
piece sprawdza, czy po raz ostatni zobaczy bieżącą wartość resp_ji
w ramach aktualnej kombinacji btn/wtn.
Łącząc to wszystko razem, stwierdzenie:
if not (first.resp_ji and last.resp_ji);
Mówi się, że jeśli bieżąca wartość resp_ji występuje wiele razy dla bieżącej kombinacji btn/wtn, zachowaj rekord, w przeciwnym razie odrzuć rekord. Zachowanie if
oświadczenie użyte w ten sposób domyślnie zachowuje/odrzuca zapis.
Aby zrobić odpowiednik w SQL, możesz zrobić coś takiego:
- Znajdź wszystkie rekordy do odrzucenia.
- Odrzuć te rekordy z oryginalnego zbioru danych.
Więc...
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
EDYTUJ :Powinienem wspomnieć, że nie ma prostego odpowiednika SQL. Może to być możliwe przez numerowanie wierszy w podzapytaniach, a następnie budowanie logiki na tym, ale byłoby to brzydkie. Może to również zależeć od specyfiki używanego języka SQL.