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 wierszemLEAD(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
- OVER, PARTITION BY, ORDER BY
- ROW_NUMBER, RANK, DENSE_RANK
- LAG, LEAD i wzorce szeregów czasowych
- Sumy narastające i średnie kroczące