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

NTH_VALUE

Возвращает значение column из n-й строки рамки окна.

MySQL 8.4
NTH_VALUE(column, n)
column
Столбец или выражение, значение которого нужно вернуть
n
Номер строки в рамке, начиная с 1
INT

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

Значение того же типа, что и column; NULL, если в рамке меньше n строк

Примеры

Второй по старшинству

MySQL 8.4
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.4
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 frame_start AND frame_end считает строки, а RANGE BETWEEN frame_start AND frame_end — значения ORDER BY.

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

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

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