SQL Academy · Урок

LAG, LEAD и шаблоны временных рядов

Сравнивайте каждую строку с предыдущей или следующей с помощью LAG и LEAD и создавайте изменения между периодами

Урок 3 из 413 шагов

«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 — локальная установка не требуется.

Все уроки этого курса

  1. OVER, PARTITION BY, ORDER BY
  2. ROW_NUMBER, RANK, DENSE_RANK
  3. LAG, LEAD и шаблоны временных рядов
  4. Накопительные итоги и скользящие средние
← Назад к SQL Academy