ROW_NUMBER (Transact-SQL)
Gibt die fortlaufende Nummer einer Zeile innerhalb einer Partition eines Resultsets zurück, beginnend mit 1 für die erste Zeile in jeder Partition.
Transact-SQL-Syntaxkonventionen
Syntax
ROW_NUMBER ( )
OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
Argumente
PARTITION BY value_expression
Teilt das von der FROM-Klausel erzeugte Resultset in Partitionen, auf die die ROW_NUMBER-Funktion angewendet wird. value_expression gibt die Spalte an, nach der das Resultset partitioniert wird. Wird PARTITION BY nicht angegeben, verarbeitet die Funktion alle Zeilen des Abfrageresultsets als einzelne Gruppe. Weitere Informationen finden Sie unter OVER-Klausel (Transact-SQL).order_by_clause
Die ORDER BY-Klausel bestimmt die Reihenfolge, in der den Zeilen die eindeutige ROW_NUMBER innerhalb einer angegebenen Partition zugewiesen wird. Sie ist erforderlich. Weitere Informationen finden Sie unter OVER-Klausel (Transact-SQL).
Rückgabetypen
bigint
Allgemeine Hinweise
Es gibt keine Garantie, dass die von einer Abfrage mit ROW_NUMBER() zurückgegeben Zeilen bei jeder Ausführung exakt gleich sind, es sei denn, die folgenden Bedingungen sind zutreffend.
Werte der partitionierten Spalte sind eindeutig.
Werte der ORDER BY-Spalten sind eindeutig.
Kombinationen der Werte der Partitionsspalte und ORDER BY-Spalten sind eindeutig.
Beispiele
A.Zurückgeben der Zeilennummer für Vertriebsmitarbeiter
Im folgenden Beispiel wird eine Zeilennummer für die Vertriebsmitarbeiter in Adventure Works Cycles auf Grundlage der Verkaufszahlen des laufenden Jahresranges berechnet.
USE AdventureWorks2012;
GO
SELECT ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS Row,
FirstName, LastName, ROUND(SalesYTD,2,1) AS "Sales YTD"
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;
Dies ist das Resultset.
Row FirstName LastName SalesYTD
--- ----------- ---------------------- -----------------
1 Linda Mitchell 4251368.54
2 Jae Pak 4116871.22
3 Michael Blythe 3763178.17
4 Jillian Carson 3189418.36
5 Ranjit Varkey Chudukatil 3121616.32
6 José Saraiva 2604540.71
7 Shu Ito 2458535.61
8 Tsvi Reiter 2315185.61
9 Rachel Valdez 1827066.71
10 Tete Mensa-Annan 1576562.19
11 David Campbell 1573012.93
12 Garrett Vargas 1453719.46
13 Lynn Tsoflias 1421810.92
14 Pamela Ansman-Wolfe 1352577.13
B.Zurückgeben einer Teilmenge von Zeilen
Im folgenden Beispiel werden Zeilennummern für alle Zeilen in der SalesOrderHeader-Tabelle in der reihenfolge des OrderDate berechnet und nur die Zeilen 50 bis 60 (einschließlich) zurückgegeben.
USE AdventureWorks2012;
GO
WITH OrderedOrders AS
(
SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (ORDER BY OrderDate) AS RowNumber
FROM Sales.SalesOrderHeader
)
SELECT SalesOrderID, OrderDate, RowNumber
FROM OrderedOrders
WHERE RowNumber BETWEEN 50 AND 60;
C.Verwenden von ROW_NUMBER () mit PARTITION
Im folgenden Beispiel wird das Argument PARTITION BY zum Partiionieren des Abfrageresultset nach der Spalte TerritoryName verwendet. Durch die ORDER BY-Klausel in der OVER-Klausel werden die Zeilen in jeder Partition nach der Spalte SalesYTD sortiert. Die ORDER BY-Klausel in der SELECT-Anweisung sortiert das gesamte Abfrageresultset nach TerritoryName.
USE AdventureWorks2012;
GO
SELECT FirstName, LastName, TerritoryName, ROUND(SalesYTD,2,1),
ROW_NUMBER() OVER(PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS Row
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0
ORDER BY TerritoryName;
Dies ist das Resultset.
FirstName LastName TerritoryName SalesYTD Row
--------- -------------------- ------------------ ------------ ---
Lynn Tsoflias Australia 1421810.92 1
José Saraiva Canada 2604540.71 1
Garrett Vargas Canada 1453719.46 2
Jillian Carson Central 3189418.36 1
Ranjit Varkey Chudukatil France 3121616.32 1
Rachel Valdez Germany 1827066.71 1
Michael Blythe Northeast 3763178.17 1
Tete Mensa-Annan Northwest 1576562.19 1
David Campbell Northwest 1573012.93 2
Pamela Ansman-Wolfe Northwest 1352577.13 3
Tsvi Reiter Southeast 2315185.61 1
Linda Mitchell Southwest 4251368.54 1
Shu Ito Southwest 2458535.61 2
Jae Pak United Kingdom 4116871.22 1