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.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

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 AdventureWorks 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 AdventureWorks;
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;