SELECT user_id, event_ts,
LEAD(event_ts) OVER (PARTITION BY user_id ORDER BY event_ts) - event_ts AS time_to_next
FROM events;
Результат:
user_id | event_ts | time_to_next 1 | 2026-01-01 10:00 | 00:05:00 1 | 2026-01-01 10:05 | NULL
SELECT order_id, status, changed_at,
LEAD(status) OVER (PARTITION BY order_id ORDER BY changed_at) AS next_status
FROM order_status_log;
Результат:
order_id | status | next_status 10 | created | paid 10 | paid | shippedПорешать SQL-задачи в тренажёре →
LEAD спрашивают в задачах на сессионизацию и воронки: «сколько времени между шагами», «какой следующий экран». На собеседовании покажи связку LEAD + разность времени и понимание, почему последняя строка NULL.
LEAD — когда нужно значение из будущего относительно текущей строки (следующий шаг, следующий период). LAG — из прошлого. Часто их берут вместе, чтобы получить и предыдущее, и следующее значение.
Возьми LEAD(event_ts) по пользователю с ORDER BY по времени и вычти текущий event_ts — получишь интервал до следующего события; сумма таких интервалов внутри сессии даёт её длительность.
NULL, так как следующей строки в окне нет. Можно подставить значение по умолчанию третьим аргументом: LEAD(x, 1, x).
Оконные функции · Сессионизация
ROW_NUMBER · RANK · DENSE_RANK · LAG · NTILE · SUM OVER
Открыть SQL-тренажёр (565 задач) →