LAG
Возвращает значение из строки, которая стоит на offset строк раньше текущей в разделе окна.
MySQL 8.1
LAG(column[, offset[, default]]) OVER ([PARTITION BY ...] [ORDER BY ...])Параметры
- column
- Столбец или выражение, значение которого берётся из предыдущей строки
- offsetINTнеобязательный
- На сколько строк назад смотреть, неотрицательное целое число, по умолчанию 1
- defaultнеобязательный
- Значение, если строки со смещением нет, по умолчанию NULL
- PARTITION BYнеобязательный
- Столбцы, по которым строки делятся на разделы, смещение не выходит за границы раздела
- ORDER BYнеобязательный
- Порядок строк, определяющий, какая строка предыдущая; без него порядок не определён
Возвращаемое значение
Значение того же типа, что и column; default или NULL, если строки со смещением нет, например у первой строки раздела
Примеры
Сдвиг на одну и две строки назад
MySQL 8.1
SELECT member_name,
birthday,
LAG(member_name) OVER (
ORDER BY birthday
) AS previous_member,
LAG(member_name, 2, 'none') OVER (
ORDER BY birthday
) AS two_rows_back
FROM FamilyMembers;Дни с прошлого платежа каждого члена семьи
MySQL 8.1
SELECT family_member,
date,
DATEDIFF(
date,
LAG(date) OVER (
PARTITION BY family_member
ORDER BY date
)
) AS days_since_previous
FROM Payments;Подробности
Типичная задача — сравнить строку с предыдущей: разница x - LAG(x) OVER (...) или DATEDIFF(date, LAG(date) OVER (...)) показывает изменение с прошлой строки. default подставляется, только когда строки со смещением нет; если она есть, но в ней NULL, вернётся NULL.