window functions in sqlscript - brandeis consulting
TRANSCRIPT
Brandeis Consulting
Agenda
▪ Vorstellung
▪ Demo Datenmodell
▪ Aggregat Funktionen
▪ Das Window
▪ Funktionen über das ganze Window
▪ Funktionen über einen Teilbereich des Windows
▪ Arten von Funktionen
▪ Zugriff auf andere Zeilen
27.2.2020 Window Functions in SQLScript 3
Brandeis Consulting
Jörg Brandeis
Selbständiger
▪ Trainer
▪ SAP BW/4HANA Berater
▪ ABAP & SQLScript Entwickler
▪ Autor
27.2.2020 Window Functions in SQLScript 4
Brandeis Consulting
Zoom
• Zoom App/Client ist besser als die Teilnahme im Browser
• Im Chat werde ich den Link zum teilen. Bitte nutzen Sie den Chat auch für
Fragen.
• Sie können in der Teilnehmerliste auch Feedback geben:
27.2.2020 Window Functions in SQLScript 5
Brandeis Consulting
Demo Datenmodell
https://gist.github.com/captainabap/b9ad5796ff7cdc3e6c515c2d6837c416
Beispiel: Lagerbestand (STOCK_QTY) und Lagerveränderungen (STOCK_DELTA)
27.2.2020 Window Functions in SQLScript 6
CREATE TABLE STOCK_QTY (
PLANT varchar(4),
MATERIAL varchar(10),
CALDAY date,
QTY int ,
primary key (PLANT,
MATERIAL,
CALDAY)
);
CREATE TABLE STOCK_DELTA (
PLANT varchar(4),
MATERIAL varchar(10),
CALDAY date,
DELTA int ,
primary key (PLANT,
MATERIAL,
CALDAY)
);
Brandeis Consulting
Übung zum Aufwärmen
Ich teile die Teilnehmer in 3er Gruppen ein, die jeweils in einer sogenannten
Breakout-Session gemeinsam arbeiten. Das kann einen kleinen Moment dauern.
Jede Session ist eine eigener kleiner Konferenzraum. Die Teilnehmer können sich
hören und einer kann seinen Desktop mit der HANA SQL-Konsole teilen.
Jeder Teilnehmer kann eigenständig zwischen Hauptsession und seiner Breakout-
Session wechseln. Bitte probieren Sie das mal aus.
Kommen Sie danach wider zurück in die Hauptsession. Wenn die meisten
Gruppen fertig sind, werde ich die Breakout Sessions beenden.
27.2.2020 Window Functions in SQLScript 7
Brandeis Consulting
Übung zum Aufwärmen
▪ Kopieren Sie das Script für das Demo Datenmodell in die SQL Konsole und
führen Sie es aus
▪ Schauen Sie sich die Daten der beiden Tabellen an. Passen die Tabellen
zusammen? Machen Sie eine Stichprobe!
27.2.2020 Window Functions in SQLScript 8
Brandeis Consulting
Aggregatfunktionen - Wiederholung
Mit Aggregatfunktionen reduzieren wir die Anzahl von Datensätzen.
Im Extremfall auf genau einen Datensatz:
SELECT COUNT(*) FROM stock_qty;
SELECT AVG(qty) FROM stock_qty;
SELECT SUM(delta) FROM stock_delta;
27.2.2020 Window Functions in SQLScript 9
Brandeis Consulting
Aggregatfunktionen - Wiederholung
Wenn wir neben den Aggregatfunktionen noch andere Felder verwenden,
müssen wir danach gruppieren:
SELECT PLANT,
MATERIAL,
SUM(DELTA)
FROM STOCK_DELTA
GROUP BY PLANT,
MATERIAL;
Pro Gruppierung wird genau eine Zeile im Ergebnis erzeugt.
27.2.2020 Window Functions in SQLScript 10
Brandeis Consulting
Was sind Window Functions?
27.2.2020 Window Functions in SQLScript 11
Window Functions …
▪ Sind skalare SQL-Funktionen
▪ Werden wie Aggregatfunktionen in der Feldliste der
SELECT Anweisung verwendet
▪ Berechnen Ergebnisse über mehrere Zeilen hinweg
▪ Berücksichtigen immer nur Daten innerhalb des
aktuellen Windows (=Gruppe)
Brandeis Consulting
Das Window
Alle Berechnungen finden innerhalb eines Ausschnitts der
Daten statt, dem sogenannten Window. Es entspricht ein
bisschen der Gruppe (GROUP BY) bei der Aggregation.
Beispiel:
(BY PARTITION plant, material)
Das Window wird häufig auch Partition oder Gruppe
genannt.
27.2.2020 Window Functions in SQLScript 12
PLANT MATERIAL CALDAY DELTA
DE01 TP012 01.01.2020 39
DE01 TP012 02.01.2020 1
DE01 TP012 03.01.2020 -5
DE01 TP012 04.01.2020 13
DE01 TP012 05.01.2020 14
DE01 TP012 06.01.2020 39
DE01 TP012 07.01.2020 -10
DE01 TP012 08.01.2020 14
DE01 TP012 09.01.2020 -14
DE02 TP012 01.01.2020 5
DE02 TP012 02.01.2020 2
DE02 TP012 03.01.2020 2
DE02 TP012 04.01.2020 7
DE02 TP012 05.01.2020 13
DE02 TP012 06.01.2020 -22
DE02 TP012 07.01.2020 38
DE02 TP012 08.01.2020 -27
DE02 TP012 09.01.2020 -4
DE01 TP001 01.01.2020 2
DE01 TP001 02.01.2020 34
DE01 TP001 03.01.2020 3
DE01 TP001 04.01.2020 24
DE01 TP001 05.01.2020 -6
DE01 TP001 06.01.2020 -20
DE01 TP001 07.01.2020 10
DE01 TP001 08.01.2020 -3
DE01 TP001 09.01.2020 15
DE02 TP001 01.01.2020 36
DE02 TP001 02.01.2020 16
DE02 TP001 03.01.2020 -1
DE02 TP001 04.01.2020 11
DE02 TP001 05.01.2020 -25
DE02 TP001 06.01.2020 41
DE02 TP001 07.01.2020 -25
DE02 TP001 08.01.2020 -48
DE02 TP001 09.01.2020 32
Brandeis Consulting
Einfachstes Beispiel: Berechnungen über die ganze Partition
SELECT PLANT,
MATERIAL,
CALDAY,
SUM(DELTA) OVER (PARTITION BY PLANT,
MATERIAL)
AS SUM_DELTA
FROM STOCK_DELTA;
Wenn weder Sortierung noch Zeilen spezifiziert sind, bezieht sich die
Window Function auf die ganze Partition.
27.2.2020 Window Functions in SQLScript 13
PLANT MATERIAL CALDAY DELTA SUM_DELTA
DE01 TP012 01.01.2020 39 91
DE01 TP012 02.01.2020 1 91
DE01 TP012 03.01.2020 -5 91
DE01 TP012 04.01.2020 13 91
DE01 TP012 05.01.2020 14 91
DE01 TP012 06.01.2020 39 91
DE01 TP012 07.01.2020 -10 91
DE01 TP012 08.01.2020 14 91
DE01 TP012 09.01.2020 -14 91
DE02 TP012 01.01.2020 5 14
DE02 TP012 02.01.2020 2 14
DE02 TP012 03.01.2020 2 14
DE02 TP012 04.01.2020 7 14
DE02 TP012 05.01.2020 13 14
DE02 TP012 06.01.2020 -22 14
DE02 TP012 07.01.2020 38 14
DE02 TP012 08.01.2020 -27 14
DE02 TP012 09.01.2020 -4 14
DE01 TP001 01.01.2020 2 59
DE01 TP001 02.01.2020 34 59
DE01 TP001 03.01.2020 3 59
DE01 TP001 04.01.2020 24 59
DE01 TP001 05.01.2020 -6 59
DE01 TP001 06.01.2020 -20 59
DE01 TP001 07.01.2020 10 59
DE01 TP001 08.01.2020 -3 59
DE01 TP001 09.01.2020 15 59
DE02 TP001 01.01.2020 36 37
DE02 TP001 02.01.2020 16 37
DE02 TP001 03.01.2020 -1 37
DE02 TP001 04.01.2020 11 37
DE02 TP001 05.01.2020 -25 37
DE02 TP001 06.01.2020 41 37
DE02 TP001 07.01.2020 -25 37
DE02 TP001 08.01.2020 -48 37
DE02 TP001 09.01.2020 32 37
Brandeis Consulting
Beispiele
▪ Vergleich des aktuellen Werts mit dem Durchschnitt, Maximum oder Minimum
der Partition
▪ Berechnung des Anteils: Wie viel Prozent am Gesamten hat die aktuelle Zeile
27.2.2020 Window Functions in SQLScript 14
Brandeis Consulting
Übungsaufgabe
Geben Sie den aktuellen Lagerbestand pro Werk, Produkt und Tag aus und
vergleichen ihn mit dem maximalen Lagerbestand in dem Betrachtungszeitraum.
D.h. wie viel % vom maximalen Lagerbestand ist der aktuelle Lagerbestand.
27.2.2020 Window Functions in SQLScript 15
Brandeis Consulting
Übungsaufgabe
Geben Sie den aktuellen Lagerbestand pro Werk, Produkt und Tag aus und
vergleichen ihn mit dem maximalen Lagerbestand in dem Betrachtungszeitraum.
D.h. wie viel % vom maximalen Lagerbestand ist der aktuelle Lagerbestand.
27.2.2020 Window Functions in SQLScript 16
Brandeis Consulting
Musterlösung Übungsaufgabe
SELECT PLANT,
MATERIAL,
CALDAY,
QTY,
CEIL(QTY / MAX(QTY) OVER (PARTITION BY PLANT,
MATERIAL)
* 100)
||'%' AS PERC_MAX
FROM STOCK_QTY;
27.2.2020 Window Functions in SQLScript 17
Brandeis Consulting
Was macht dieser ABAP Code?
SORT lt_tmp BY plant material calday.
LOOP AT lt_tmp ASSIGNING FIELD-SYMBOL(<ls_tmp>).
AT NEW material.
CLEAR lv_sum_delta.
END AT.
lv_sum_delta = lv_sum_delta + <ls_tmp>-delta.
<ls_tmp>-sum_delta = lv_sum_delta.
ENDLOOP.
27.2.2020 Window Functions in SQLScript 18
Brandeis Consulting
Window Functions mit ORDER BY
Solang nicht sortiert wird, beziehen sich die
Funktionen auf die gesamte Partition.
Wenn sortiert wird, bezieht sich die Funktion auf alle
Werte bis einschließlich der aktuellen Zeile.
27.2.2020 Window Functions in SQLScript 19
PLANT MATERIAL CALDAY DELTA SUM_DELTA
DE01 TP012 01.01.2020 39 39
DE01 TP012 02.01.2020 1 40
DE01 TP012 03.01.2020 -5 35
DE01 TP012 04.01.2020 13 48
DE01 TP012 05.01.2020 14 62
DE01 TP012 06.01.2020 39 101
DE01 TP012 07.01.2020 -10 91
DE01 TP012 08.01.2020 14 105
DE01 TP012 09.01.2020 -14 91
DE02 TP012 01.01.2020 5 5
DE02 TP012 02.01.2020 2 7
DE02 TP012 03.01.2020 2 9
DE02 TP012 04.01.2020 7 16
DE02 TP012 05.01.2020 13 29
DE02 TP012 06.01.2020 -22 7
DE02 TP012 07.01.2020 38 45
DE02 TP012 08.01.2020 -27 18
DE02 TP012 09.01.2020 -4 14SELECT PLANT,
MATERIAL,
CALDAY,
SUM(DELTA) OVER (PARTITION BY PLANT, MATERIAL
ORDER BY CALDAY) AS SUM_DELTA
FROM STOCK_DELTA;
Brandeis Consulting
Beispiele
Transformation von Bewegungen in Bestände
Lagerbestand
Kontostand
27.2.2020 Window Functions in SQLScript 20
Brandeis Consulting
Übungsaufgabe
Fügen Sie der bisherigen Abfrage noch eine Sortierung nach CALDAY hinzu.
Damit wird der aktuelle Bestand mit dem bisherigen Höchststand verglichen.
27.2.2020 Window Functions in SQLScript 21
Brandeis Consulting
Ergebnis der Übungsaufgabe
SELECT PLANT,
MATERIAL,
CALDAY,
QTY,
CEIL(QTY / MAX(QTY) OVER (PARTITION BY PLANT,
MATERIAL
ORDER BY CALDAY
)
* 100)
||'%' AS PERC_MAX
FROM STOCK_QTY;
27.2.2020 Window Functions in SQLScript 22
Brandeis Consulting
Explizites Festlegen der zu berücksichtigenden Zeilen
PLANT MATERIAL CALDAY QTY AVG_QTY
DE01 TP012 01.01.2020 41 55
DE01 TP012 02.01.2020 68 56
DE01 TP012 03.01.2020 55 58
DE01 TP012 04.01.2020 58 58
DE01 TP012 05.01.2020 64 46
DE01 TP012 06.01.2020 42 42
DE01 TP012 07.01.2020 11 42
DE01 TP012 08.01.2020 32 37
DE01 TP012 09.01.2020 60 35
DE02 TP012 01.01.2020 36 53
DE02 TP012 02.01.2020 84 41
DE02 TP012 03.01.2020 37 40
DE02 TP012 04.01.2020 5 41
DE02 TP012 05.01.2020 34 32
DE02 TP012 06.01.2020 44 39
DE02 TP012 07.01.2020 36 58
DE02 TP012 08.01.2020 75 64
DE02 TP012 09.01.2020 99 70
27.2.2020 Window Functions in SQLScript 23
SELECT PLANT,
MATERIAL,
CALDAY,
QTY,
CEIL( AVG(QTY) OVER ( PARTITION BY PLANT,
MATERIAL
ORDER BY CALDAY
ROWS BETWEEN 2 PRECEDING
AND 2 FOLLOWING ))
AS AVG_QTY
FROM STOCK_QTY;
Brandeis Consulting
ROWS-Klausel
ROWS BETWEEN 2 PRECEDING
AND 2 FOLLOWING
ROWS BETWEEN CURRENT ROW
AND UNBOUNDED FOLOWING
ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW
27.2.2020 Window Functions in SQLScript 24
Brandeis Consulting
Die wichtigsten Funktionen
▪ Berechnungen▪ COUNT()
▪ SUM()
▪ AVG()
▪ VAR()
▪ Einzelwerte▪ MIN()
▪ MAX()
▪ MEDIAN()
▪ FIRST_VALUE()
▪ LAST_VALUE()
▪ NTH_VALUE(<N>)
27.2.2020 Window Functions in SQLScript 25
▪ Nummerierungen
▪ ROW_NUMBER()
▪ RANK()
▪ DENSE_RANK()
▪ Blockbildung
▪ RANDOM_PARTITION() –
Verteilung auf 3 Mengen
▪ BINNING() – Verteilung auf N
Mengen nach Werten
▪ NTILE() – Verteilung auf N Mengen
nach Sortierung
▪ Positionierung
▪ PERCENT_RANK()
Brandeis Consulting
Und noch einmal ABAP
SORT lt_tmp BY plant material calday.
LOOP AT lt_tmp ASSIGNING FIELD-SYMBOL(<ls_tmp>).
AT NEW material.
CLEAR lv_last_qty.
END AT.
<ls_tmp>-delta= lv_last_qty - <ls_tmp>-qty.
lv_last_qty = <ls_tmp>-qty.
ENDLOOP.
27.2.2020 Window Functions in SQLScript 26
Brandeis Consulting
LEAD und LAG - zwei spezielle Funktionen
LAG(<expr>) – Der Wert des Ausdrucks <expr> der Zeile davor, entsprechend
der Sortierung
LEAD(<expr>) – Das Gleiche für die folgende Zeile
27.2.2020 Window Functions in SQLScript 27
SELECT PLANT,
MATERIAL,
CALDAY,
QTY,
LAG(QTY) OVER (PARTITION BY PLANT,
MATERIAL
ORDER BY CALDAY) AS LAST
FROM STOCK_QTY;
Brandeis Consulting
Übungsaufgabe
Berechnen Sie aus der Tabelle STOCK_QTY die täglichen Bestandsveränderungen.
Bestandsveränderung = Endbestand Vortag – Endbestand heute
27.2.2020 Window Functions in SQLScript 28
Brandeis Consulting
Musterlösung
27.2.2020 Window Functions in SQLScript 29
SELECT PLANT,
MATERIAL,
CALDAY,
QTY,
QTY - IFNULL(LAG(QTY) OVER (PARTITION BY PLANT,
MATERIAL
ORDER BY CALDAY), 0)
AS DELTA_CALC
FROM STOCK_QTY ;
Brandeis Consulting
Allgemein
Window Functions werden in der Row Engine ausgeführt.
➔Meistens ist ein Wechsel der Engine notwendig.
Die gleiche Logik in ABAP ist aber sicherlich nicht schneller.
27.2.2020 Window Functions in SQLScript 30
Brandeis Consulting
Kontaktdaten
Jörg Brandeis
E-Mail: [email protected]
Website: www.brandeis.de
Twitter: @joerg_brandeis
Und natürlich über Xing oder LinkedIn
27.2.2020 Window Functions in SQLScript 32