SORT gefolgt von DELETE ADJACENT DUPLICATES ist ein festes Paar in ABAP-Routinen. Es reduziert das Paket auf einen Satz je Schlüssel, und die Sortierung bestimmt, welcher Satz das ist. In SQLScript gibt es beides nicht. Stattdessen nummeriert ROW_NUMBER() die Sätze innerhalb jeder Gruppe, und die Nummer eins bleibt.
SORT und DELETE ADJACENT DUPLICATES
Die ABAP-Routine
Je Material und Werk soll nur der zuletzt geänderte Satz ins Ziel. Die Sortierung nach changed_on absteigend stellt den jüngsten Satz an den Anfang jeder Gruppe, DELETE ADJACENT DUPLICATES löscht die folgenden.
METHOD start_routine.
SORT source_package BY material
plant
changed_on DESCENDING.
DELETE ADJACENT DUPLICATES FROM source_package
COMPARING material plant.
ENDMETHOD.
Die SQLScript-Fassung
ROW_NUMBER() OVER (PARTITION BY … ORDER BY …) vergibt je Gruppe fortlaufende Nummern in der angegebenen Reihenfolge. PARTITION BY entspricht COMPARING, ORDER BY dem SORT; DESCENDING wird zu DESC. Das Feld record am Ende des ORDER BY macht die Reihenfolge eindeutig, wenn zwei Sätze dasselbe Änderungsdatum tragen.
Es braucht zwei Schritte, weil die Fensterfunktion nicht in der WHERE-Bedingung desselben SELECT stehen darf. Die Zwischentabelle trägt das Hilfsfeld rn, die Ausgabe listet nur die Felder von outTab.
lt_ranked = SELECT src.*,
ROW_NUMBER() OVER ( PARTITION BY material, plant
ORDER BY changed_on DESC, record ) AS rn
FROM :inTab AS src;
outTab = SELECT material,
plant,
changed_on,
amount,
record,
sql__procedure__source__record
FROM :lt_ranked
WHERE rn = 1;
Ein SORT ohne anschließendes DELETE ADJACENT DUPLICATES hat keine Entsprechung: Eine Tabellenvariable hat keine Reihenfolge, und ein ORDER BY auf outTab bringt für das Ziel in BW nichts. Meist bereitet ein solches SORT einen READ TABLE oder einen LOOP mit AT NEW vor. Dafür gibt es in SQLScript eigene Muster, siehe Teil 5.