Share via


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 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.

  1. Werte der partitionierten Spalte sind eindeutig.

  2. Werte der ORDER BY-Spalten sind eindeutig.

  3. 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

Siehe auch

Verweis

RANK (Transact-SQL)

DENSE_RANK (Transact-SQL)

NTILE (Transact-SQL)