Windowed Funktion in Windowed funktion

IchHH

Datenbank-Guru
Beiträge
291
Hallo alle zusammen,

ich habe ein Frage. Wie erreicht man es in SQL die Werte der vorherigen Spalte zu erhalten wenn diese ebenfalls auf eine andere aufbaut?

Eine LAG in LAG Funktion, also

SELECT
MANDT
,MATNR
,WERKS
,Menge+LAG(LAG(SUM(Menge)) OVER (PARTITION BY MATNR, WERKS ORDER BY KWYEAR)) OVER (PARTITION BY MATNR, WERKS ORDER BY KWYEAR) Menge
,KWYEAR
,TYP
,Key_Stueckliste
,STF1
,STF0
FROM BS

geht bekanntlich nicht, weil eine Windowed Funktion nicht in einer Windowed Funktion ausgeführt werden darf. Welchen Workaround gibt es hier für eine Tabelle die als View dargestellt wird?
 
Werbung:
Menge+LAG(LAG(SUM(Menge)) OVER (PARTITION BY MATNR, WERKS ORDER BY KWYEAR)) OVER (PARTITION BY MATNR, WERKS ORDER BY KWYEAR)

geht bekanntlich nicht, weil eine Windowed Funktion nicht in einer Windowed Funktion ausgeführt werden darf.
Ich würde mich der Frage von @akretschmer anschließen und ich verstehe nicht wirklich, was eine solcher verschachtelter Aufruf bringen soll.
2 Ideen trotzdem dazu:
- vielleicht willst Du nicht Vorgänger eines Zeilenwertes verwenden, sondern Vor-Vorgänger?
Dazu kann man in Lag einen Offset angeben.
- vielleicht willst Du was ganz anderes, so eine Art Rekursion?
Dann gibt es dazu mglw. andere Funktionen, deren Verhalten man bspw. mit Running Total beschreibt? Das Prinzip kannst Du mal googlen. Ich weiß allerdings nicht, was MS SQL an Funktionen dazu hergibt. Geht aber bestimmt.
 
Das Buzzword war es. LEG kann also doch noch mehr und die Lösung lautet:

SUM(Menge) OVER (PARTITION BY MATNR, WERKS ORDER BY MATNR, WERKS, KWYEAR)
 
LAG ist doch in meinem Code oben ebenhalten und das Buzzword was in Google in Zusammenhang mit SQL geholfen hat war "Running Total". Dadurch habe ich mitbekommen das man LAG auch ganz anders verwenden kann. Seit dem Verstehe ich auch die Formel, was mir das leben extrem leichter macht. Mehr solche lichten Momente und ich habe das Gefühl, dass sich langsam alles fügt.
 
Werbung:
LAG ist doch in meinem Code oben ebenhalten
Ok, Du hast Deine Lösung und es ist nicht weiter dramatisch. Aber in Deinem "Code oben", den Du als Lösung bezeichnest ist LAG nicht enthalten:

SUM(Menge) OVER (PARTITION BY MATNR, WERKS ORDER BY MATNR, WERKS, KWYEAR)

Und die Aufgabenstellung war also ein "Running Total" zu produzieren. Ich denke, damit kann dann vielleicht noch jemand was anfangen, der über den Thread stolpert.
Und weil die richtigen Stichworte so wichtig sind für die erfolgreiche Internet Suche:
LAG() ist eine von vielen "Window Functions" in SQL, die m.E. ein Paradigmenwechsel in der Abfrage Relationaler DB sind. Einfach gesagt, die Arbeit damit verschiebt sich von rein Mengen basierter Verarbeitung zu Arbeitsweisen / Datenzugriff, wie man ihn von Spread Sheet Programmen kennt.
Und nur sicherheitshalber "Window Functions" hat nichts mit dem ähnlich genannten Betriebssystem und dessen Funktionen zu tun.
 
Zurück
Oben