Przejdź do głównej treści
eLearner.app
Moduł 7 · Lekcja 3 z 427/57 w kursie~12 min
Lekcje modułu (3/4)

LAG, LEAD i sumy bieżące

LAG i LEAD to dwie specjalne funkcje okna, do których możesz uzyskać dostęp inne wiersze tej samej partycji: poprzedni wiersz (LAG) lub następny (LEAD) zgodnie z ORDER BY okna. Oni są narzędzie umożliwiające porównania między wierszami (delty, różnice, interwały) oraz — w połączeniu z SUM/AVG/COUNT OVER — dla sumy bieżącej.

LAG: poprzedni wiersz

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

Przykład: dla każdego zamówienia „dni od poprzedniego zamówienia przez to samo klient":

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;

Pierwsze zamówienie każdego klienta ma since_previous_order = NULL, ponieważ w partycji nie ma „poprzedniej”.

LEAD: następny rząd

Lustro LAG. Typowe: „czas do następnego zdarzenia”, „różnica z następną wersją”.

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

Bieżące sumy: agreguje z OVER

Funkcje agregujące (SUM, AVG, COUNT, MAX, MIN) stają się skumulowane w połączeniu z OVER (… ORDER BY …):

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

Dla każdego wiersza SUM oblicza sumę ** wszystkich wierszy w partycji do ten punkt**, zgodnie z ORDER BY okna. Rezultatem jest klasyczny „bieżący balans”.

Spróbuj

Ćwiczenie#sql.m7.l3.e1
Próby: 0Ładowanie...

Dla każdego zamówienia pokaż id, identyfikator_klienta, zamówione_at i kolumnę dni_od_poprzedniego, która jest liczbą pełnych dni (z FLOOR) pomiędzy bieżącym zamówieniem a poprzednim zamówieniem tego samego klienta, zamówionym przez zamówione_at. NULL, jeśli nie ma poprzedniego zamówienia. Zamawiaj według identyfikatora klienta i zamówionego_at.

Ładowanie edytora...
Pokaż wskazówkę

LAG(ordered_at) OVER (PARTITION BY Customer_id ORDER BY Ordered_at) zwraca znacznik czasu poprzedniego zamówienia klienta. Odejmij, aby otrzymać INTERWAŁ, a następnie zamień na dni.

Rozwiązanie dostępne po 3 próbach

Przejrzyj ćwiczenie

Ćwiczenie#sql.m7.l3.e2
Próby: 0Ładowanie...

Dla każdego dostarczonego zamówienia (status = „dostarczone”) pokaż id, identyfikator_klienta, zamówione_w, zamówienie_total (suma ilości * cena_jednostkowa jego pozycji) i running_total (bieżąca suma sum na klienta, zamówionych przez Order_at). Użyj CTE dla Order_total. Zamawiaj według identyfikatora klienta i zamówionego_at.

Ładowanie edytora...
Pokaż wskazówkę

CTE oblicza sumę na zamówienie; Funkcja SUM OVER generuje w czasie sumę bieżącą na klienta.

Rozwiązanie dostępne po 3 próbach