Изявлението използва това, което се нарича „обработка чрез група“. Преди стъпката да може да се изпълни, тя изисква данните да бъдат сортирани по btn wtn resp_ji
.
first.resp_ji
piece проверява дали за първи път вижда текущата стойност на resp_ji в текущата комбинация btn/wtn. По същия начин last.resp_ji
piece проверява дали е последният път, когато ще види текущата стойност на resp_ji
в рамките на текущата комбинация btn/wtn.
Комбинирайки всичко заедно с изявлението:
if not (first.resp_ji and last.resp_ji);
Казва се, че ако текущата стойност на resp_ji се среща няколко пъти за текущата комбинация от btn/wtn, тогава записът се запазва, в противен случай се отхвърля записът. Поведението на if
изразът, когато се използва по този начин, имплицитно запазва/отхвърля записа.
За да направите еквивалента в SQL, можете да направите нещо като:
- Намерете всички записи за изхвърляне.
- Изхвърлете тези записи от оригиналния набор от данни.
И така...
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
РЕДАКТИРАНЕ :Трябва да спомена, че няма прост SQL еквивалент. Може да е възможно чрез номериране на редове в подзаявки и след това изграждане на логика отгоре на това, но би било ужасно. Може да зависи и от специфичния вид на използвания SQL.