Salt la conținutul principal
Modulul 7 · Lecția 3 din 427/57 în curs~12 min
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

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'è

Exemplu: pentru fiecare comandă, „zile de la comanda anterioară de către același client":

SQL
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”.

SQL
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 …):

SQL
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ă

Exercițiu#sql.m7.l3.e1
Încercări: 0Se încarcă…

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.

Se încarcă editorul...
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

Exercițiu#sql.m7.l3.e2
Încercări: 0Se încarcă…

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.

Se încarcă editorul...
Afișează indiciu

CTE calculează totalul per comandă; SUM OVER produce totalul curent per client în timp.

Soluție disponibilă după 3 încercări