0Pricing
SQL Academy · Lekcja

LAG, LEAD i wzorce szeregów czasowych

Porównuj każdy wiersz z poprzednim lub następnym elementem za pomocą LAG i LEAD oraz buduj różnice między okresami.

LAG, LEAD i wzorce szeregów czasowych to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.

LAG i LEAD: spoglądanie wstecz i naprzód

Funkcje te uzyskują dostęp do sąsiednich wierszy w oknie:

  • LAG(col, n, default) — wartość z n wierszy przed bieżącym wierszem
  • LEAD(col, n, default) — wartość z n wierszy po bieżącym wierszu

Poprzedni wiersz

Porównaj każde zamówienie z poprzednim zamówieniem tego samego użytkownika:

SELECT id, user_id, created_at, total,
       LAG(total) OVER (
         PARTITION BY user_id ORDER BY created_at
       ) AS prev_total
FROM orders;

Zmiana dzień do dnia

Różnica względem poprzedniego dnia:

SELECT day, revenue,
       revenue - LAG(revenue) OVER (ORDER BY day) AS delta
FROM daily_revenue
ORDER BY day;

Zmiana rok do roku

LAG z przesunięciem 12 w szeregu miesięcznym:

SELECT month, revenue,
       LAG(revenue, 12) OVER (ORDER BY month) AS prev_year_revenue,
       revenue / NULLIF(LAG(revenue, 12) OVER (ORDER BY month), 0) - 1 AS yoy
FROM monthly_revenue;

Wykrywanie luk

Znajdź dni, w których brakuje danych:

WITH d AS (
  SELECT day, LAG(day) OVER (ORDER BY day) AS prev_day FROM daily_signups
)
SELECT day, prev_day, day - prev_day AS gap_days
FROM d
WHERE day - prev_day > 1;

Wyodrębnianie sesji

Grupuj wiersze w sesje, gdy przerwa przekracza określony próg:

WITH gaps AS (
  SELECT user_id, ts,
         CASE WHEN ts - LAG(ts) OVER (PARTITION BY user_id ORDER BY ts)
                 > INTERVAL '30 min'
              THEN 1 ELSE 0 END AS new_session
  FROM events
)
SELECT user_id, ts,
       SUM(new_session) OVER (PARTITION BY user_id ORDER BY ts) AS session_id
FROM gaps;

Pierwszy i ostatni element grupy

FIRST_VALUE i LAST_VALUE pobierają granice okna:

SELECT id, total,
       FIRST_VALUE(total) OVER (PARTITION BY user_id ORDER BY created_at) AS first_order,
       LAST_VALUE(total)  OVER (PARTITION BY user_id ORDER BY created_at
         ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_order
FROM orders;
-- LAST_VALUE needs the explicit frame, otherwise default frame ends at current row.

NTH_VALUE

Wybierz n-tą wartość w partycji:

SELECT id,
       NTH_VALUE(total, 2) OVER (
         PARTITION BY user_id ORDER BY total DESC
         ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
       ) AS second_largest
FROM orders;

Wartość domyślna w szeregu czasowym

Trzeci argument LAG jest wartością domyślną, gdy nie istnieje poprzedni wiersz:

SELECT day, revenue,
       revenue - LAG(revenue, 1, 0) OVER (ORDER BY day) AS delta
FROM daily_revenue;
-- delta on first day = revenue itself (vs NULL)

Odpowiednik self-join

Funkcję LAG można zapisać jako self-join, ale byłoby to wolniejsze i mniej czytelne. Zawsze należy preferować funkcje okna.

Wydajność

Funkcje okna przechodzą przez partycję jeden raz. Wąskim gardłem jest sortowanie — w miarę możliwości należy indeksować kolumny ORDER BY.

Podsumowanie

LAG i LEAD umożliwiają porównywanie kolejnych wierszy.

  • Poprzedni/następny wiersz w obrębie partycji
  • Różnice, zmiany okres do okresu, wyodrębnianie sesji
  • FIRST_VALUE/LAST_VALUE do wyznaczania granic

Szybkie sprawdzenie

Chcą Państwo obliczyć zmianę przychodów dzień do dnia. Której funkcji okna należy użyć?

Często zadawane pytania

Czy lekcja „LAG, LEAD i wzorce szeregów czasowych” jest bezpłatna?

Tak — pełny tekst „LAG, LEAD i wzorce szeregów czasowych” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „LAG, LEAD i wzorce szeregów czasowych”?

Porównuj każdy wiersz z poprzednim lub następnym elementem za pomocą LAG i LEAD oraz buduj różnice między okresami. Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć SQL Academy?

Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „LAG, LEAD i wzorce szeregów czasowych”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?

Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. OVER, PARTITION BY, ORDER BY
  2. ROW_NUMBER, RANK, DENSE_RANK
  3. LAG, LEAD i wzorce szeregów czasowych
  4. Sumy narastające i średnie kroczące
← Powrót do SQL Academy