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

LAG

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

Синтаксис

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

Дивиться на рядок вище в заданому порядку й повертає звідти значення. Зсув — на скільки рядків назад (за замовчуванням 1), а третій аргумент підставляється, коли попереднього рядка нема. Дзеркальна функція LEAD бере значення з наступного рядка.

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

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, amount,
LAG(amount) OVER (ORDER BY created_at) AS previous_amount
FROM orders;
idcreated_atamountprevious_amount
12026-07-03 10:15:00120.50NULL
22026-07-28 18:40:0080.25120.50
32026-08-09 09:05:00199.9980.25
42026-08-21 14:30:0045.00199.99
52026-09-02 11:00:0064.7545.00

У першого замовлення попереднього нема, тому там NULL.

На скільки змінилась сума
SELECT id, amount,
amount - LAG(amount) OVER (ORDER BY created_at) AS difference
FROM orders;
idamountdifference
1120.50NULL
280.25-40.25
3199.99119.74
445.00-154.99
564.7519.75
Попереднє й наступне поруч
SELECT id, amount,
LAG(amount) OVER (ORDER BY created_at) AS previous_amount,
LEAD(amount) OVER (ORDER BY created_at) AS next_amount
FROM orders;
idamountprevious_amountnext_amount
1120.50NULL80.25
280.25120.50199.99
3199.9980.2545.00
445.00199.9964.75
564.7545.00NULL

Зверни увагу

Що таке «попередній», вирішує ORDER BY в OVER. Без нього порядок непередбачуваний — завжди задавай його явно.

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

LAG не можна писати у WHERE: буде помилка window functions are not allowed in WHERE. Спершу порахуй у підзапиті, а фільтруй зовні.

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