Справочник по функциям

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;
member_namebirthdayprevious_membertwo_rows_back
Headley Quincey1960-05-13<NULL>none
Ernest Forrest1961-09-11Headley Quinceynone
Flavia Quincey1963-02-16Ernest ForrestHeadley Quincey
Constance Forrest1968-09-06Flavia QuinceyErnest Forrest
Andie Quincey1983-06-05Constance ForrestFlavia Quincey
Lela Quincey1985-06-07Andie QuinceyConstance Forrest
Annie Quincey1988-04-10Lela QuinceyAndie Quincey
Wednesday Addams2005-01-13Annie QuinceyLela Quincey

Дни с прошлого платежа каждого члена семьи

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;
family_memberdatedays_since_previous
12005-02-03<NULL>
12005-02-129
12005-03-1127
12005-04-2040
12005-05-1323
12005-06-0523
12006-01-15224
12006-03-1256
22005-03-18<NULL>
22005-03-235

Подробности

Типичная задача — сравнить строку с предыдущей: разница x - LAG(x) OVER (...) или DATEDIFF(date, LAG(date) OVER (...)) показывает изменение с прошлой строки. default подставляется, только когда строки со смещением нет; если она есть, но в ней NULL, вернётся NULL.

Смотрите также

Где изучить