LAG, LEAD и шаблоны временных рядов
Сравнивайте каждую строку с предыдущей или следующей с помощью LAG и LEAD и создавайте изменения между периодами
«LAG, LEAD и шаблоны временных рядов» — бесплатный урок SQL Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
LAG и LEAD: просмотр назад и вперёд
Эти функции обращаются к соседним строкам в окне:
LAG(col, n, default)— значение на n строк раньше текущейLEAD(col, n, default)— значение на n строк позже текущей
Предыдущая строка
Сравните каждый заказ с предыдущим заказом того же пользователя:
SELECT id, user_id, created_at, total,
LAG(total) OVER (
PARTITION BY user_id ORDER BY created_at
) AS prev_total
FROM orders;Изменение по сравнению с предыдущим днём
Разница с предыдущим днём:
SELECT day, revenue,
revenue - LAG(revenue) OVER (ORDER BY day) AS delta
FROM daily_revenue
ORDER BY day;Изменение по сравнению с предыдущим годом
LAG со смещением 12 для помесячного ряда:
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;Поиск пропусков
Найдите дни с отсутствующими данными:
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;Формирование сессий
Объединяйте строки в сессии, когда промежуток превышает заданный порог:
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;Первая и последняя строки группы
FIRST_VALUE и LAST_VALUE получают границы окна:
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
Выберите N-е значение в секции:
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;Значение по умолчанию для временного ряда
Третий аргумент LAG задаёт значение по умолчанию, если предыдущей строки не существует:
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)Эквивалентное самосоединение
Можно записать LAG через самосоединение, но это будет медленнее и менее наглядно. Всегда отдавайте предпочтение оконным функциям.
Производительность
Оконные функции проходят по секции один раз. Узкое место — сортировка; по возможности создавайте индексы для столбцов из ORDER BY.
Итоги
LAG и LEAD позволяют сравнивать строки между собой.
- Предыдущая и следующая строки внутри секции
- Изменения, сравнение периодов, формирование сессий
- FIRST_VALUE/LAST_VALUE для получения границ
Быстрая проверка
Вы хотите вычислить изменение выручки по сравнению с предыдущим днём. Какую оконную функцию следует использовать?
Изучай SQL с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 46
- Уроки
- 183
Часто задаваемые вопросы
Урок «LAG, LEAD и шаблоны временных рядов» бесплатный?
Да — полный текст урока «LAG, LEAD и шаблоны временных рядов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «LAG, LEAD и шаблоны временных рядов»?
Сравнивайте каждую строку с предыдущей или следующей с помощью LAG и LEAD и создавайте изменения между периодами Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «LAG, LEAD и шаблоны временных рядов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- OVER, PARTITION BY, ORDER BY
- ROW_NUMBER, RANK, DENSE_RANK
- LAG, LEAD и шаблоны временных рядов
- Накопительные итоги и скользящие средние