SELECT month, revenue,
revenue - LAG(revenue) OVER (ORDER BY month) AS diff,
ROUND((revenue - LAG(revenue) OVER (ORDER BY month))
/ LAG(revenue) OVER (ORDER BY month)::numeric * 100, 1) AS mom_pct
FROM monthly;
Результат:
month | revenue | diff | mom_pct 2026-01 | 1000 | NULL | NULL 2026-02 | 1200 | 200 | 20.0 2026-03 | 1080 | -120 | -10.0
SELECT user_id, order_date,
order_date - LAG(order_date) OVER (PARTITION BY user_id ORDER BY order_date) AS days_gap
FROM orders;
Результат:
user_id | order_date | days_gap 1 | 2026-01-01 | NULL 1 | 2026-01-08 | 7Порешать SQL-задачи в тренажёре →
Расчёт MoM/WoW прироста через LAG — почти обязательный вопрос на собеседовании продуктового и BI-аналитика. Умей объяснить, почему первая строка NULL и как оконная функция применяется поверх уже агрегированной выручки.
LAG берёт значение из предыдущей строки окна, LEAD — из следующей. LAG используют для сравнения с прошлым, LEAD — чтобы «заглянуть вперёд» (например, время до следующего события).
Второй аргумент — величина сдвига: LAG(revenue, 3) берёт значение из строки на 3 позиции раньше (например, тот же месяц год назад при месячной гранулярности со сдвигом 12).
Для первой строки окна нет предыдущей, поэтому LAG возвращает NULL. Чтобы подставить своё значение, укажи третий аргумент: LAG(x, 1, 0).
Оконные функции · Анализ выручки · Работа с датами
ROW_NUMBER · RANK · DENSE_RANK · LEAD · NTILE · date_trunc
Открыть SQL-тренажёр (565 задач) →