Příkaz používá to, co se nazývá „zpracováním skupiny“. Před spuštěním kroku je nutné, aby byla data seřazena podle btn wtn resp_ji
.
first.resp_ji
kus kontroluje, zda je to poprvé, co vidí aktuální hodnotu resp_ji v rámci aktuální kombinace btn/wtn. Podobně last.resp_ji
kus kontroluje, zda je to poslední čas, kdy uvidí aktuální hodnotu resp_ji
v rámci aktuální kombinace btn/wtn.
Spojením všeho dohromady výrok:
if not (first.resp_ji and last.resp_ji);
Říká se, že pokud se aktuální hodnota resp_ji vyskytuje vícekrát pro aktuální kombinaci btn/wtn, ponechte záznam, jinak záznam zahoďte. Chování if
příkaz při takovém použití implicitně uchovává/zahazuje záznam.
Chcete-li provést ekvivalent v SQL, můžete udělat něco jako:
- Najděte všechny záznamy, které chcete zahodit.
- Zrušte tyto záznamy z původní datové sady.
Takže...
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
UPRAVIT :Měl bych zmínit, že neexistuje žádný jednoduchý ekvivalent SQL. Možná by to bylo možné očíslováním řádků v dílčích dotazech a vytvořením logiky nad tím, ale bylo by to ošklivé. Může to také záviset na konkrétní verzi používaného SQL.