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;Сколько прошло с предыдущей покупки
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;Подробности
Разницу с предыдущей строкой считают как column - LAG(column) OVER (...): у первой строки раздела она равна NULL. Значение default должно быть того же типа, что и column.