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

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;
member_namebirthdaysecond_oldest
Headley Quincey1960-05-13<NULL>
Ernest Forrest1961-09-11Ernest Forrest
Flavia Quincey1963-02-16Ernest Forrest
Constance Forrest1968-09-06Ernest Forrest
Andie Quincey1983-06-05Ernest Forrest
Lela Quincey1985-06-07Ernest Forrest
Annie Quincey1988-04-10Ernest Forrest
Wednesday Addams2005-01-13Ernest Forrest

Вторая зарплата в каждом отделе

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;
department_idnamesalarysecond_salary
1Dmitry Sokolov220000210000
1Anna Ivanova210000210000
1Igor Petrov195000210000
1Pavel Smirnov180000210000
1Elena Kozlova175000210000
2Irina Volkova205000200000
2Olga Novikova200000200000
2Maxim Morozov160000200000
2Nikita Popov160000200000
3Tatiana Lebedeva170000155000

Подробности

С рамкой по умолчанию n-я строка видна только начиная с неё самой: у первых n - 1 строк раздела результат NULL. Чтобы получить значение для всех строк, задайте рамку на весь раздел. NTH_VALUE(column, 1) — то же, что FIRST_VALUE(column).

Рамка задаёт, какие строки раздела видит функция, и пишется после ORDER BY: ROWS BETWEEN начало AND конец считает строки, а RANGE BETWEEN начало AND конец — значения ORDER BY.

ГраницаЧто означает
UNBOUNDED PRECEDINGПервая строка раздела
n PRECEDINGn строк до текущей
CURRENT ROWТекущая строка
n FOLLOWINGn строк после текущей
UNBOUNDED FOLLOWINGПоследняя строка раздела

Без рамки действует правило по умолчанию. Если в OVER есть ORDER BY, рамка идёт от начала раздела до текущей строки, включая строки с тем же значением ORDER BY. Если ORDER BY нет, рамка — весь раздел.

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