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.
Syntax
ROW_NUMBER ( ) OVER ( [ <partition_by_clause> ] <order_by_clause> )
Argumente
<partition_by_clause>
Teilt das von der FROM-Klausel erzeugte Resultset in Partitionen, auf die die ROW_NUMBER-Funktion angewendet wird. Informationen zur Syntax von PARTITION BY finden Sie unter OVER-Klausel (Transact-SQL).<order_by_clause>
Bestimmt die Reihenfolge, in der der ROW_NUMBER-Wert den Zeilen in einer Partition zugewiesen wird. Weitere Informationen finden Sie unter ORDER BY-Klausel (Transact-SQL). Eine ganze Zahl kann keine Spalte darstellen, wenn <order_by_clause> in einer Rangfolgefunktion verwendet wird.
Rückgabetypen
bigint
Hinweise
Die ORDER BY-Klausel bestimmt die Reihenfolge, in der den Zeilen die eindeutige ROW_NUMBER innerhalb einer angegebenen Partition zugewiesen wird.
Beispiele
A. Zurückgeben der Zeilennummer für Vertriebsmitarbeiter
Im folgenden Beispiel wird die ROW_NUMBER für die Vertriebsmitarbeiter in AdventureWorks2008R2 basierend auf den Verkaufszahlen des laufenden Jahres zurückgegeben.
SELECT FirstName, LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', SalesYTD, PostalCode
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;
B. Zurückgeben einer Teilmenge von Zeilen
Im folgenden Beispiel werden Zeilen mit Zahlen zwischen 50 und 60 einschließlich in der Reihenfolge von OrderDate zurückgegeben.
USE AdventureWorks2008R2;
GO
WITH OrderedOrders AS
(
SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
FROM Sales.SalesOrderHeader
)
SELECT *
FROM OrderedOrders
WHERE RowNumber BETWEEN 50 AND 60;
C. Verwenden von ROW_NUMBER () mit PARTITION
Im folgenden Beispiel wird die Verwendung der ROW_NUMBER-Funktion mit dem PARTITION BY-Argument dargestellt.
SELECT FirstName, LastName, ROW_NUMBER() OVER(PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS 'Row Number', SalesYTD, PostalCode
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;