ROW_NUMBER (Transact-SQL)

Aktualisiert: 17. Juli 2006

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

ms186734.note(de-de,SQL.90).gifHinweis:
ORDER BY in der OVER-Klausel sortiert ROW_NUMBER. Wenn Sie der SELECT-Anweisung, die nach einer Spalte (nach Spalten) anstelle von 'Row Number' the sortiert, eine ORDER BY-Klausel hinzufügen, wird das Resultset nach der äußeren ORDER BY-Klausel sortiert.

Im folgenden Beispiel wird die ROW_NUMBER für die Vertriebsmitarbeiter in AdventureWorks basierend auf den Verkaufszahlen des laufenden Jahres zurückgegeben.

USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName
    ,ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number'
    ,s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson s 
    INNER JOIN Person.Contact c 
        ON s.SalesPersonID = c.ContactID
    INNER JOIN Person.Address a 
        ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL 
    AND SalesYTD <> 0;

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;

Im folgenden Beispiel wird die Verwendung des PARTITION BY-Arguments dargestellt.

USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName
    ,ROW_NUMBER() OVER 
    (PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS 'Row Number'
    ,s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson s 
    INNER JOIN Person.Contact c 
        ON s.SalesPersonID = c.ContactID
    INNER JOIN Person.Address a 
        ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL 
    AND SalesYTD <> 0;

Änderungsverlauf

Version Verlauf

17. Juli 2006

Neuer Inhalt:
  • Das Beispiel für das PARTITION BY-Argument wurde hinzugefügt.

Siehe auch

Verweis

RANK (Transact-SQL)
DENSE_RANK (Transact-SQL)
NTILE (Transact-SQL)
Rangfolgefunktionen (Transact-SQL)
Funktionen (Transact-SQL)

Hilfe und Informationen

Informationsquellen für SQL Server 2005