0Pricing
SQL Academy · Урок

LAG и LEAD с оконными рамками

Объединяйте LAG/LEAD с оконными рамками, чтобы вычислять изменения за период и находить пропуски во временных рядах

«LAG и LEAD с оконными рамками» — бесплатный урок SQL Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

Итоги по LAG/LEAD

LAG(col, n) возвращает значение, находящееся на n строк выше текущей строки в окне. LEAD(col, n) смотрит вперёд.

SELECT day, revenue,
       LAG(revenue) OVER (ORDER BY day) AS prev_day_revenue
FROM daily_revenue;

LAG со значением по умолчанию

Третий аргумент задаёт значение по умолчанию, если соседней строки нет:

LAG(revenue, 1, 0) OVER (ORDER BY day)
-- Returns 0 instead of NULL for the very first row.

Вычисление разностей

Изменение по сравнению с предыдущим днём:

SELECT day, revenue,
       revenue - LAG(revenue, 1, 0) OVER (ORDER BY day) AS delta
FROM daily_revenue;

Многошаговый LAG

Сравнение с данными N дней назад — полезно для сравнений неделя к неделе и год к году:

LAG(revenue, 7) OVER (ORDER BY day)   -- 7 days ago
LAG(revenue, 365) OVER (ORDER BY day) -- 1 year ago

LEAD для прогнозных интервалов

Шаблоны для вопроса «какое событие будет следующим?»:

SELECT id, ts,
       LEAD(ts) OVER (PARTITION BY user_id ORDER BY ts) AS next_ts,
       LEAD(ts) OVER (PARTITION BY user_id ORDER BY ts) - ts AS gap_to_next
FROM events;

Шаблоны для отдельных пользователей

LAG/LEAD учитывают PARTITION BY:

SELECT user_id, ts, action,
       LAG(action) OVER (PARTITION BY user_id ORDER BY ts) AS prev_action
FROM events;
-- prev_action is the user's previous event, not globally.

Обнаружение изменений состояния

Объедините LAG с CASE:

SELECT id, status,
  CASE WHEN status <> LAG(status) OVER (ORDER BY ts) THEN 'changed' ELSE 'same' END
FROM orders;

FIRST_VALUE/LAST_VALUE

Первое или последнее значение в пределах рамки:

FIRST_VALUE(status) OVER (PARTITION BY order_id ORDER BY ts) AS first_status
-- The status when the order was first seen.

LAST_VALUE(status) OVER (
  PARTITION BY order_id ORDER BY ts
  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS final_status

NTH_VALUE

N-е значение в упорядоченном окне:

NTH_VALUE(revenue, 3) OVER (
  ORDER BY revenue DESC
  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)
-- Third-highest revenue value.

Функции рамки для групп

Объедините LAG с PARTITION BY для получения соседних строк в группах:

SELECT user_id, ts, page,
       LAG(page) OVER (PARTITION BY user_id ORDER BY ts) AS prev_page,
       LEAD(page) OVER (PARTITION BY user_id ORDER BY ts) AS next_page
FROM page_views;

Производительность

Оконные функции выполняют сортировку один раз для каждого раздела. Индексируйте столбцы (PARTITION BY, ORDER BY), если разделы велики.

Итоги

LAG/LEAD недорого сравнивают соседние строки.

  • Значение по умолчанию позволяет избежать NULL
  • Объединяйте с CASE для обнаружения изменений состояния
  • FIRST_VALUE/LAST_VALUE/NTH_VALUE дополняют это семейство функций

Быстрая проверка

Вы хотите добавить в каждую строку интервал (в секундах) до следующего события пользователя. Какую функцию использовать?

Часто задаваемые вопросы

Урок «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 структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «LAG и LEAD с оконными рамками»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Academy?

Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Рамки: ROWS и RANGE
  2. LAG и LEAD с оконными рамками
  3. Разбиение на группы с NTILE и Cume_Dist
  4. Шаблоны отчётности из реальной практики
← Назад к SQL Academy