Die Anweisung verwendet, was als "by group processing" bezeichnet wird. Bevor der Schritt ausgeführt werden kann, müssen die Daten nach btn wtn resp_ji
sortiert werden .
Die first.resp_ji
piece überprüft, ob es das erste Mal ist, dass es den aktuellen Wert von resp_ji innerhalb der aktuellen btn/wtn-Kombination sieht. Ebenso die last.resp_ji
piece prüft, ob es das letzte Mal ist, dass es den aktuellen Wert von resp_ji
sieht innerhalb der aktuellen btn/wtn-Kombination.
Alles zusammen die Aussage:
if not (first.resp_ji and last.resp_ji);
Das heißt, wenn der aktuelle Wert von resp_ji mehrmals für die aktuelle Kombination von btn/wtn auftritt, dann den Datensatz behalten, andernfalls den Datensatz verwerfen. Das Verhalten von if
Anweisung, wenn sie so verwendet wird, behält/verwirft implizit den Datensatz.
Um das Äquivalent in SQL auszuführen, könnten Sie Folgendes tun:
- Alle zu verwerfenden Datensätze finden.
- Verwerfen Sie diese Datensätze aus dem ursprünglichen Datensatz.
Also...
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
BEARBEITEN :Ich sollte erwähnen, dass es kein einfaches SQL-Äquivalent gibt. Es kann möglich sein, Zeilen in Unterabfragen zu nummerieren und dann Logik darauf aufzubauen, aber es wäre hässlich. Es kann auch von der spezifischen Variante von SQL abhängen, die verwendet wird.