LAST_VALUE
Возвращает значение column из последней строки рамки окна.
MySQL 8.1
LAST_VALUE(column) OVER ([PARTITION BY ...] [ORDER BY ...] [frame])Параметры
- column
- Столбец или выражение, значение которого нужно вернуть
- PARTITION BYнеобязательный
- Столбцы, по которым строки делятся на разделы
- ORDER BYнеобязательный
- Порядок строк в разделе, определяющий, какая строка последняя; без него рамка — весь раздел, а последняя строка произвольная
- frameключевое словонеобязательный
- Рамка окна: ROWS или RANGE BETWEEN начало AND конец; по умолчанию от начала раздела до текущей строки, весь раздел — ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
Возвращаемое значение
Значение того же типа, что и column
Примеры
Самый младший в каждом статусе
MySQL 8.1
SELECT member_name,
status,
birthday,
LAST_VALUE(member_name) OVER (
PARTITION BY status
ORDER BY birthday ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS youngest_in_status
FROM FamilyMembers;Рамка по умолчанию — до текущей строки
MySQL 8.1
SELECT member_name,
status,
birthday,
LAST_VALUE(member_name) OVER (
PARTITION BY status
ORDER BY birthday
) AS last_in_frame
FROM FamilyMembers;Подробности
Рамка по умолчанию заканчивается текущей строкой (и строками с тем же значением ORDER BY), а не концом раздела, поэтому без своей рамки функция часто возвращает значение текущей строки.
Рамка задаёт, какие строки раздела видит функция, и пишется после ORDER BY: ROWS BETWEEN начало AND конец считает строки, а RANGE BETWEEN начало AND конец — значения ORDER BY.
Без рамки действует правило по умолчанию. Если в OVER есть ORDER BY, рамка идёт от начала раздела до текущей строки, включая строки с тем же значением ORDER BY. Если ORDER BY нет, рамка — весь раздел.