Direkt zum Hauptinhalt springen
eLearner.app
Modul 7 · Lektion 3 von 427/57 im Kurs~12 min
Lektionen des Moduls (3/4)

LAG, LEAD und laufende Summen

LAG und LEAD sind zwei spezielle Fensterfunktionen, auf die Sie zugreifen können Andere Zeilen derselben Partition: die vorherige Zeile (LAG) oder die nächsten (LEAD) entsprechend dem ORDER BY des Fensters. Sie sind die Go-to-Tool für Zeilenvergleiche (Deltas, Variationen, Intervalle) und – kombiniert mit SUM/AVG/COUNT OVER – für laufende Summen.

LAG: die vorherige Zeile

SQL
LAG(colonna)            OVER (PARTITION BY p ORDER BY o)
LAG(colonna, n)         OVER (PARTITION BY p ORDER BY o)   -- n righe indietro
LAG(colonna, n, default) OVER (PARTITION BY p ORDER BY o)  -- default se non c'è

Beispiel: für jede Bestellung „Tage seit der vorherigen Bestellung durch denselben“. Kunde":

Code
SELECT id,
       customer_id,
       ordered_at,
       ordered_at - LAG(ordered_at) OVER (
         PARTITION BY customer_id ORDER BY ordered_at
       ) AS since_previous_order
FROM   orders
ORDER BY customer_id, ordered_at;

Die erste Bestellung jedes Kunden hat since_previous_order = NULL, weil Es gibt kein „Vorheriges“ in der Partition.

LEAD: die nächste Zeile

Der Spiegel von LAG. Typisch: „Zeit bis zum nächsten Ereignis“, „Differenz“. mit der nächsten Version".

SQL
SELECT id, ordered_at,
       LEAD(ordered_at) OVER (PARTITION BY customer_id ORDER BY ordered_at)
         - ordered_at AS to_next
FROM   orders;

Laufende Summen: Aggregate mit OVER

Aggregatfunktionen (SUM, AVG, COUNT, MAX, MIN) werden kumulativ bei Kombination mit OVER (… ORDER BY …):

SQL
SELECT order_id,
       total,
       SUM(total) OVER (
         PARTITION BY customer_id
         ORDER BY     ordered_at
       ) AS running_total
FROM   …;

Für jede Zeile berechnet SUM die Summe aller Zeilen in der Partition bis diesem Punkt**, gemäß dem ORDER BY des Fensters. Das Ergebnis ist das klassische „Laufwaage“.

Probieren Sie es aus

Übung#sql.m7.l3.e1
Versuche: 0Wird geladen…

Zeigen Sie für jede Bestellung die ID, die Kunden-ID, das Bestelldatum und eine Spalte „Tage von_vorheriger“ an, die die Anzahl der ganzen Tage (mit FLOOR) zwischen der aktuellen Bestellung und der vorherigen Bestellung desselben Kunden angibt, sortiert nach Bestelldatum. NULL, wenn keine vorherige Bestellung vorliegt. Bestellen Sie nach customer_id und order_at.

Editor wird geladen…
Hinweis anzeigen

LAG(ordered_at) OVER (PARTITION BY customer_id ORDER BYordered_at) gibt den Zeitstempel der vorherigen Bestellung des Kunden zurück. Subtrahieren Sie, um ein INTERVALL zu erhalten, und konvertieren Sie es dann in Tage.

Lösung nach 3 Versuchen verfügbar

Wiederholungsübung

Übung#sql.m7.l3.e2
Versuche: 0Wird geladen…

Zeigen Sie für jede gelieferte Bestellung (Status = „geliefert“) die ID, die Kunden-ID, die Bestellnummer, die Bestellsumme (Summe aus Menge * Stückpreis der Einzelposten) und die laufende Gesamtsumme pro Kunde an, bestellt nach Bestelladresse. Verwenden Sie einen CTE für order_total. Bestellen Sie nach customer_id und order_at.

Editor wird geladen…
Hinweis anzeigen

Der CTE berechnet die Gesamtsumme pro Bestellung; SUM OVER ergibt die laufende Summe pro Kunde im Zeitverlauf.

Lösung nach 3 Versuchen verfügbar