Lecții din modul (3/4)
LAG, LEAD și totaluri curente
LAG și LEAD sunt două funcții speciale ale ferestrei care vă oferă acces la
alte rânduri ale aceleiași partiții: rândul anterior (LAG) sau
următorul (LEAD) conform ORDER BY din fereastră. Ei sunt
instrument de acces pentru comparații rând cu rând (delte, variații, intervale)
și — combinat cu SUM/AVG/COUNT OVER — pentru totaluri cumulate.
LAG: rândul anterior
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'èExemplu: pentru fiecare comandă, „zile de la comanda anterioară de către același client":
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;Prima comandă a fiecărui client are since_previous_order = NULL deoarece
nu există „anterior” în partiție.
PLUMB: următorul rând
Oglinda lui LAG. Tipic: „timp până la următorul eveniment”, „diferență
cu următoarea versiune”.
SELECT id, ordered_at,
LEAD(ordered_at) OVER (PARTITION BY customer_id ORDER BY ordered_at)
- ordered_at AS to_next
FROM orders;Totaluri cumulate: agregate cu OVER
Funcțiile agregate (SUM, AVG, COUNT, MAX, MIN) devin
cumulat când este combinat cu OVER (… ORDER BY …):
SELECT order_id,
total,
SUM(total) OVER (
PARTITION BY customer_id
ORDER BY ordered_at
) AS running_total
FROM …;Pentru fiecare rând, SUM calculează suma tuturor rândurilor din partiție până la
acel punct, conform ORDER BY din fereastră. Rezultatul este
clasic „balanță de alergare”.
Încearcă
Pentru fiecare comandă afișați id, customer_id, ordered_at și o coloană days_from_previous care este numărul de zile întregi (cu FLOOR) între comanda curentă și cea anterioară a aceluiași client, comandată de ordered_at. NULL dacă nu există o comandă anterioară. Comandă după customer_id și ordered_at.
Afișează indiciu
LAG(ordered_at) OVER (PARTITION BY customer_id ORDER BY ordered_at) returnează marcajul de timp al comenzii anterioare a clientului. Scădeți pentru a obține un INTERVAL, apoi convertiți în zile.
Soluție disponibilă după 3 încercări
Exercițiu de revizuire
Pentru fiecare comandă livrată (starea = „livrată”), afișați id, customer_id, ordered_at, order_total (suma cantității * unit_price a elementelor sale rând) și running_total (totalul total al totalurilor per client, comandat de ordered_at). Utilizați un CTE pentru order_total. Comandă după customer_id și ordered_at.
Afișează indiciu
CTE calculează totalul per comandă; SUM OVER produce totalul curent per client în timp.
Soluție disponibilă după 3 încercări