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

LAG

Возвращает значение из строки, которая стоит на offset строк раньше текущей в разделе окна.

PostgreSQL 17.5
LAG(column[, offset[, default]]) OVER ([PARTITION BY ...] [ORDER BY ...])

Параметры

column
Столбец или выражение, значение которого берётся из предыдущей строки
offsetintegerнеобязательный
На сколько строк назад смотреть, по умолчанию 1; отрицательное значение смотрит вперёд, как LEAD
defaultнеобязательный
Значение того же типа, что и column, если строки со смещением нет, по умолчанию NULL
PARTITION BYнеобязательный
Столбцы, по которым строки делятся на разделы, смещение не выходит за границы раздела
ORDER BYнеобязательный
Порядок строк, определяющий, какая строка предыдущая

Возвращаемое значение

Значение того же типа, что и column; default или NULL, если строки со смещением нет, например у первой строки раздела

Примеры

Сдвиг на одну и две строки назад

PostgreSQL 17.5
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

Сколько прошло с предыдущей покупки

PostgreSQL 17.5
SELECT family_member,
	date,
	LAG(date) OVER (
		PARTITION BY family_member
		ORDER BY date
	) AS previous_date,
	date - LAG(date) OVER (
		PARTITION BY family_member
		ORDER BY date
	) AS since_previous
FROM Payments
ORDER BY family_member,
	date;
family_memberdateprevious_datesince_previous
12005-02-03<NULL><NULL>
12005-02-122005-02-039 days
12005-03-112005-02-1227 days
12005-04-202005-03-1140 days
12005-05-132005-04-2023 days
12005-06-052005-05-1323 days
12006-01-152005-06-05224 days
12006-03-122006-01-1556 days
22005-03-18<NULL><NULL>
22005-03-232005-03-185 days

Подробности

Разницу с предыдущей строкой считают как column - LAG(column) OVER (...): у первой строки раздела она равна NULL. Значение default должно быть того же типа, что и column.

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

Где изучить