Функция LAG() в SQL: синтаксис, примеры расчёта прироста

LAG() — оконная функция, которая возвращает значение из предыдущей строки в пределах окна (ORDER BY). Это главный инструмент аналитика для расчёта прироста: выручка к прошлому месяцу (MoM), сравнение с предыдущим днём, разница между соседними событиями. Парная к ней функция — LEAD(), берущая значение из следующей строки.

Синтаксис

LAG(колонка, смещение, значение_по_умолчанию) OVER (PARTITION BY … ORDER BY …)

Примеры использования

Пример 1: Прирост выручки к предыдущему месяцу (MoM %)

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

Пример 2: Разница дней между заказами клиента

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-задачи в тренажёре →

Типичная ошибка

У первой строки окна LAG вернёт NULL (предыдущей строки нет) — это нормально, но при делении на LAG для процента прироста оберни знаменатель в NULLIF или помни, что первая строка даст NULL. Третий аргумент задаёт значение по умолчанию вместо NULL: LAG(revenue, 1, 0).

Где спрашивают на собеседовании

Расчёт MoM/WoW прироста через LAG — почти обязательный вопрос на собеседовании продуктового и BI-аналитика. Умей объяснить, почему первая строка NULL и как оконная функция применяется поверх уже агрегированной выручки.

FAQ: частые вопросы про LAG

Чем LAG отличается от LEAD?

LAG берёт значение из предыдущей строки окна, LEAD — из следующей. LAG используют для сравнения с прошлым, LEAD — чтобы «заглянуть вперёд» (например, время до следующего события).

Как задать смещение больше 1?

Второй аргумент — величина сдвига: LAG(revenue, 3) берёт значение из строки на 3 позиции раньше (например, тот же месяц год назад при месячной гранулярности со сдвигом 12).

Почему LAG выдаёт NULL в первой строке?

Для первой строки окна нет предыдущей, поэтому LAG возвращает NULL. Чтобы подставить своё значение, укажи третий аргумент: LAG(x, 1, 0).

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы SQL

Оконные функции · Анализ выручки · Работа с датами

Другие функции SQL

ROW_NUMBER · RANK · DENSE_RANK · LEAD · NTILE · date_trunc

Открыть SQL-тренажёр (565 задач) →