SQL Academy
Premium
Funktionsreferenz

NTH_VALUE

Gibt den Wert von column aus der n-ten Zeile des Fensterrahmens zurück.

MySQL 8.1
NTH_VALUE(column, n) OVER ([PARTITION BY ...] [ORDER BY ...] [frame])

Parameter

column
Spalte oder Ausdruck, dessen Wert zurückgegeben wird
nINT
Nummer der Zeile im Rahmen, beginnend mit 1
PARTITION BYoptional
Spalten, nach denen die Zeilen in Partitionen aufgeteilt werden
ORDER BYoptional
Reihenfolge der Zeilen in der Partition, die bestimmt, welche Zeile die n-te ist
frameSchlüsselwortoptional
Fensterrahmen: ROWS oder RANGE BETWEEN start AND end; standardmäßig vom Anfang der Partition bis zur aktuellen Zeile

Rückgabewert

Wert vom Typ von column; NULL, wenn der Rahmen weniger als n Zeilen hat

Beispiele

Zweitältestes Mitglied

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

Zweites Gehalt in jeder Abteilung

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

Details

Mit dem Standardrahmen ist die n-te Zeile erst ab ihr selbst sichtbar: Die ersten n - 1 Zeilen der Partition bekommen NULL. Um den Wert für alle Zeilen zu erhalten, setze den Rahmen auf die ganze Partition. NTH_VALUE(column, 1) ist dasselbe wie FIRST_VALUE(column).

Der Rahmen legt fest, welche Zeilen der Partition die Funktion sieht, und wird nach ORDER BY geschrieben: ROWS BETWEEN start AND end zählt Zeilen, während RANGE BETWEEN start AND end die Werte aus ORDER BY verwendet.

GrenzeBedeutung
UNBOUNDED PRECEDINGDie erste Zeile der Partition
n PRECEDINGn Zeilen vor der aktuellen
CURRENT ROWDie aktuelle Zeile
n FOLLOWINGn Zeilen nach der aktuellen
UNBOUNDED FOLLOWINGDie letzte Zeile der Partition

Ohne Rahmen gilt die Standardregel. Hat OVER ein ORDER BY, reicht der Rahmen vom Anfang der Partition bis zur aktuellen Zeile, einschließlich der Zeilen mit demselben Wert in ORDER BY. Ohne ORDER BY ist der Rahmen die ganze Partition.

Siehe auch