window functions in sqlscript - brandeis consulting

32
Brandeis Consulting Window Functions in SQLScript Online Schulung 27.3.2020

Upload: others

Post on 15-Mar-2022

11 views

Category:

Documents


0 download

TRANSCRIPT

Brandeis Consulting

Window Functionsin SQLScript

Online Schulung

27.3.2020

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

Haben Sie Fragen?

27.2.2020 Window Functions in SQLScript 31

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

Brandeis Consulting

Vielen Dank!

27.2.2020 Window Functions in SQLScript 33