Віконністандарт SQL

LEAD

Бере значення з наступного рядка, щоб порівняти з поточним.

Синтаксис

LEAD(<вираз>) OVER (ORDER BY <критерій>)
LEAD(<вираз>, <зсув>, <за замовчуванням>) OVER (ORDER BY <критерій>)
LEAD(<вираз>) OVER (PARTITION BY <група> ORDER BY <критерій>)

Дзеркало LAG: дивиться на рядок нижче в заданому порядку й повертає звідти значення. Зсув — на скільки рядків уперед (за замовчуванням 1), а третій аргумент підставляється, коли наступного рядка нема. Зручно, щоб дізнатися, що було «після»: коли прийшло наступне замовлення і скільки часу до нього минуло.

Дані для прикладів

employees

namedepartmentsalarybonusphone
Emmabackend1200300+44 7700 900123
Liambackend1000NULLNULL
Oliviafrontend1350150+44 7700 900456
Noahfrontend950NULL+44 7700 900789
Sophiadesign1200200NULL

orders

idcreated_atamount
12026-07-03 10:15:00120.50
22026-07-28 18:40:0080.25
32026-08-09 09:05:00199.99
42026-08-21 14:30:0045.00
52026-09-02 11:00:0064.75

Ці таблиці вже створено в пісочниці — приклади нижче працюють із ними. Хочеш повторити у своїй базі — скопіюй SQL.

Дата наступного замовлення
SELECT id, created_at,
LEAD(created_at) OVER (ORDER BY created_at) AS next_order
FROM orders;
idcreated_atnext_order
12026-07-03 10:15:002026-07-28 18:40:00
22026-07-28 18:40:002026-08-09 09:05:00
32026-08-09 09:05:002026-08-21 14:30:00
42026-08-21 14:30:002026-09-02 11:00:00
52026-09-02 11:00:00NULL

В останнього замовлення наступного нема, тому там NULL.

Скільки часу до наступного замовлення
SELECT id, created_at,
LEAD(created_at) OVER (ORDER BY created_at) - created_at AS time_to_next
FROM orders;
idcreated_attime_to_next
12026-07-03 10:15:0025 days 08:25:00
22026-07-28 18:40:0011 days 14:25:00
32026-08-09 09:05:0012 days 05:25:00
42026-08-21 14:30:0011 days 20:30:00
52026-09-02 11:00:00NULL
Наступний у своєму відділі
SELECT name, department, salary,
LEAD(name) OVER (PARTITION BY department ORDER BY salary DESC) AS next_in_department
FROM employees;
namedepartmentsalarynext_in_department
Emmabackend1200Liam
Liambackend1000NULL
Sophiadesign1200NULL
Oliviafrontend1350Noah
Noahfrontend950NULL

PARTITION BY рахує «наступного» лише всередині відділу: після Liam у backend нікого нема.

Зверни увагу

Для останнього рядка результат NULL. Потрібне інше значення — передай третій аргумент: LEAD(amount, 1, 0).

«Наступний» визначає ORDER BY в OVER, а не ORDER BY в кінці запиту. Відсортуєш результат інакше — наступним лишиться той самий рядок.

Використати результат у WHERE того самого запиту не можна — спершу порахуй його в підзапиті, а фільтруй уже зовні.

Схожі функції