0Pricing
SQL Academy · Lekcja

Wzorce raportowania z rzeczywistego świata

Implementować klasyczne pulpity: krzywe retencji, top-N w kategorii i sesjonizację — wszystko za pomocą funkcji okna

Wzorce raportowania z rzeczywistego świata to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 4 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.

Wzorzec: Top-N dla każdej grupy

3 najdroższe zamówienia dla każdego użytkownika:

WITH ranked AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY total DESC) AS rn
  FROM orders
)
SELECT * FROM ranked WHERE rn <= 3;

Wzorzec: sumy narastające

Skumulowane przychody w czasie:

SELECT day, revenue,
       SUM(revenue) OVER (ORDER BY day) AS running_total
FROM daily_revenue;

Wzorzec: pierwsze wystąpienie

Pierwszy moment, w którym każdy użytkownik wykonał daną akcję:

SELECT user_id, action, MIN(ts) AS first_at
FROM events
GROUP BY user_id, action;

-- Or with window functions for full row:
WITH firsts AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id, action ORDER BY ts) AS rn
  FROM events
)
SELECT * FROM firsts WHERE rn = 1;

Wzorzec: retencja kohortowa

Użytkownicy pogrupowani według tygodnia rejestracji, retencja w tygodniu N:

WITH cohorts AS (
  SELECT id AS user_id, date_trunc('week', created_at) AS cohort_week
  FROM users
),
activities AS (
  SELECT user_id, date_trunc('week', ts) AS active_week FROM events
)
SELECT c.cohort_week,
       (a.active_week - c.cohort_week) / 7 AS week_offset,
       COUNT(DISTINCT a.user_id) AS active
FROM cohorts c
JOIN activities a USING (user_id)
WHERE a.active_week >= c.cohort_week
GROUP BY c.cohort_week, week_offset
ORDER BY c.cohort_week, week_offset;

Wzorzec: analiza lejka

Ilu użytkowników dociera do każdego kroku:

SELECT
  COUNT(*)                                  AS signed_up,
  COUNT(*) FILTER (WHERE first_login_at IS NOT NULL) AS logged_in,
  COUNT(*) FILTER (WHERE first_purchase_at IS NOT NULL) AS purchased
FROM users;

Wzorzec: tworzenie sesji

Grupuj zdarzenia w sesje, gdy odstęp przekracza 30 minut:

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;

Wzorzec: porównanie okresów

Porównaj bieżący miesiąc z poprzednim:

SELECT month, revenue,
       LAG(revenue) OVER (ORDER BY month) AS prev_month,
       revenue - LAG(revenue) OVER (ORDER BY month) AS delta,
       (revenue::FLOAT / NULLIF(LAG(revenue) OVER (ORDER BY month), 0) - 1) * 100 AS pct_change
FROM monthly_revenue
ORDER BY month;

Wzorzec: dane przestawne

Format szeroki z użyciem FILTER:

SELECT user_id,
       SUM(amount) FILTER (WHERE month = '2024-01') AS jan,
       SUM(amount) FILTER (WHERE month = '2024-02') AS feb,
       SUM(amount) FILTER (WHERE month = '2024-03') AS mar
FROM monthly_spend
GROUP BY user_id;

Wzorzec: aktywni użytkownicy dzisiaj

DAU/WAU/MAU:

SELECT
  COUNT(DISTINCT user_id) FILTER (WHERE ts >= NOW() - INTERVAL '1 day')  AS dau,
  COUNT(DISTINCT user_id) FILTER (WHERE ts >= NOW() - INTERVAL '7 days') AS wau,
  COUNT(DISTINCT user_id) FILTER (WHERE ts >= NOW() - INTERVAL '30 days') AS mau
FROM events;

Wzorzec: uzupełnianie luk

Dni bez zdarzeń powinny wyświetlać 0, a nie być pomijane:

SELECT day, COALESCE(COUNT(e.id), 0) AS events
FROM generate_series(CURRENT_DATE - 30, CURRENT_DATE, INTERVAL '1 day') AS day
LEFT JOIN events e ON date_trunc('day', e.ts) = day
GROUP BY day
ORDER BY day;

Łączenie funkcji okna w celu uzyskania szczegółowych informacji

Wiele kolumn okienkowych w jednym zapytaniu — czytelnie i szybko:

SELECT day, revenue,
       LAG(revenue) OVER w               AS prev,
       AVG(revenue) OVER (ORDER BY day ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS avg_7d,
       SUM(revenue) OVER (ORDER BY day)  AS running_total
FROM daily_revenue
WINDOW w AS (ORDER BY day)
ORDER BY day;

Podsumowanie

Większość raportów opiera się na kilku wzorcach: Top-N, sumach narastających, kohortach, lejkach, sesjach, porównaniach okresów, tabelach przestawnych i uzupełnianiu luk. Po opanowaniu tych wzorców można tworzyć dowolne dashboardy wymagające SQL.

Szybki test

Tworzą Państwo raport „5 najlepszych produktów w każdej kategorii”. Który idiomatyczny wzorzec SQL należy zastosować?

Często zadawane pytania

Czy lekcja „Wzorce raportowania z rzeczywistego świata” jest bezpłatna?

Tak — pełny tekst „Wzorce raportowania z rzeczywistego świata” 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 „Wzorce raportowania z rzeczywistego świata”?

Implementować klasyczne pulpity: krzywe retencji, top-N w kategorii i sesjonizację — wszystko za pomocą funkcji okna Ć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 4 z 4.

Ile czasu zajmuje lekcja „Wzorce raportowania z rzeczywistego świata”?

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. Klauzule ramki: ROWS a RANGE
  2. LAG/LEAD z oknami ramki
  3. Grupowanie za pomocą NTILE i Cume_Dist
  4. Wzorce raportowania z rzeczywistego świata
← Powrót do SQL Academy