Data Analyst Professional · Модуль 5 · Урок 18 із 51
LAG, LEAD і аналіз змін у часі
LAG читає попередній, а LEAD — наступний рядок у визначеному window order. Вони порівнюють періоди без self-join, але коректність залежить від повного calendar grain і стабільного порядку.
Спочатку агрегуйте до потрібного періоду
WITH monthly AS (
SELECT DATE_TRUNC('month', ordered_at)::date AS month,
channel,
SUM(net_amount) AS revenue
FROM seowork_lab.orders
WHERE status = 'completed'
GROUP BY 1, 2
)
SELECT month, channel, revenue,
LAG(revenue) OVER (PARTITION BY channel ORDER BY month) AS previous_revenue
FROM monthly;LAG над order-level rows порівнював би сусідні orders, а не місяці. Window input grain має відповідати питанню.
Зміна й темп зростання
WITH compared AS (
SELECT m.*,
LAG(revenue) OVER (PARTITION BY channel ORDER BY month) AS previous_revenue
FROM monthly AS m
)
SELECT *,
revenue - previous_revenue AS absolute_change,
(revenue - previous_revenue) / NULLIF(previous_revenue, 0) AS growth_rate
FROM compared;Перший period має NULL previous value. Zero denominator — окрема бізнес-ситуація, яку не можна приховувати довільним нулем.
Missing periods змінюють сенс
Якщо у channel немає лютого, LAG для березня поверне січень — попередній наявний row, а не попередній календарний місяць. Для month-over-month побудуйте calendar spine, CROSS JOIN із dimensions і LEFT JOIN facts.
Один row на кожен очікуваний period × segment.
Missing fact стає явним NULL або zero лише за затвердженим правилом.
Period key унікальний усередині partition.
Перший/останній row пояснено, а не втрачено.
Практика і QA
- Побудуйте monthly revenue per channel.
- Додайте previous revenue, absolute change і growth rate.
- Знайдіть gaps у послідовності місяців.
- Порівняйте LAG до і після calendar spine.
- Звірте monthly totals із базовим control query.
Офіційна довідка
Модуль завершено
Після успішного тесту відкриється проєкт: відтворюване SQL-дослідження на навчальному наборі SEOWORK.
Закріпіть матеріал уроку
Три сценарні питання. Для зарахування уроку потрібно дати щонайменше дві правильні відповіді.