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 agoLEAD для прогнозных интервалов
Шаблоны для вопроса «какое событие будет следующим?»:
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_statusNTH_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 — локальная установка не требуется.
Все уроки этого курса
- Рамки: ROWS и RANGE
- LAG и LEAD с оконными рамками
- Разбиение на группы с NTILE и Cume_Dist
- Шаблоны отчётности из реальной практики