NTH_VALUE
Возвращает значение column из n-й строки рамки окна.
MySQL 8.1
NTH_VALUE(column, n) OVER ([PARTITION BY ...] [ORDER BY ...] [frame])Параметры
- column
- Столбец или выражение, значение которого нужно вернуть
- nINT
- Номер строки в рамке, начиная с 1
- PARTITION BYнеобязательный
- Столбцы, по которым строки делятся на разделы
- ORDER BYнеобязательный
- Порядок строк в разделе, определяющий, какая строка n-я
- frameключевое словонеобязательный
- Рамка окна: ROWS или RANGE BETWEEN начало AND конец; по умолчанию от начала раздела до текущей строки
Возвращаемое значение
Значение того же типа, что и column; NULL, если в рамке меньше n строк
Примеры
Второй по старшинству
MySQL 8.1
SELECT member_name,
birthday,
NTH_VALUE(member_name, 2) OVER (
ORDER BY birthday
) AS second_oldest
FROM FamilyMembers;Вторая зарплата в каждом отделе
MySQL 8.1
SELECT department_id,
name,
salary,
NTH_VALUE(salary, 2) OVER (
PARTITION BY department_id
ORDER BY salary DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS second_salary
FROM employees;Подробности
С рамкой по умолчанию n-я строка видна только начиная с неё самой: у первых n - 1 строк раздела результат NULL. Чтобы получить значение для всех строк, задайте рамку на весь раздел. NTH_VALUE(column, 1) — то же, что FIRST_VALUE(column).
Рамка задаёт, какие строки раздела видит функция, и пишется после ORDER BY: ROWS BETWEEN начало AND конец считает строки, а RANGE BETWEEN начало AND конец — значения ORDER BY.
Без рамки действует правило по умолчанию. Если в OVER есть ORDER BY, рамка идёт от начала раздела до текущей строки, включая строки с тем же значением ORDER BY. Если ORDER BY нет, рамка — весь раздел.