Share via


RANK (Transact-SQL)

Gibt den Rang jeder Zeile innerhalb der Partition eines Resultsets zurück. Der Rang einer Zeile ergibt sich, indem 1 zur Anzahl von Rängen vor der fraglichen Zeile addiert wird.

Themenlink (Symbol) Transact-SQL-Syntaxkonventionen

Syntax

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )

Argumente

  • OVER ( [ partition_by_clause ] order_by_clause**)**
    partition_by_clause teilt das von der FROM-Klausel erzeugte Resultset in Partitionen, auf die die Funktion angewendet wird. Wird dies nicht angegeben, verarbeitet die Funktion alle Zeilen des Abfrageresultsets als einzelne Gruppe. order_by_clause bestimmt die Reihenfolge der Daten, bevor die Funktion angewendet wird. Die Angabe order_by_clause ist erforderlich. Die <Zeilen- oder Bereichsklausel> der OVER-Klausel kann für die RANK-Funktion nicht angegeben werden. Weitere Informationen finden Sie unter OVER-Klausel (Transact-SQL).

Rückgabetypen

bigint

Hinweise

Wenn zwei oder mehr Zeilen gleichwertig sind, erhält jede gleichwertige Zeile denselben Rang. Wenn beispielsweise zwei Vertriebsmitarbeiter denselben SalesYTD-Wert aufweisen, erhalten beide den Rang 1. Der Vertriebsmitarbeiter mit dem nächsthöheren SalesYTD-Wert erhält den Rang 3, da es bereits zwei Zeilen mit einem höheren Rang gibt. Aus diesem Grund gibt die RANK-Funktion nicht immer aufeinander folgende ganze Zahlen zurück.

Die Sortierreihenfolge, die für die ganze Abfrage verwendet wird, bestimmt die Reihenfolge, mit der die Zeilen in einem Resultset aufgeführt sind.

Beispiele

A.Ordnen von Zeilen innerhalb einer Partition

Im folgenden Beispiel wird die Rangfolge der Produkte im Bestand für die angegebenen Lagerstandorte gemäß ihren Mengen bestimmt. Das Resultset wird nach LocationID partitioniert und logisch nach Quantity sortiert. Beachten Sie, dass die Produkte 494 und 495 die gleiche Menge haben. Da sie verbunden sind, wird beiden Rang 1 zugeordnet.

USE AdventureWorks2012;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity
    ,RANK() OVER 
    (PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS Rank
FROM Production.ProductInventory AS i 
INNER JOIN Production.Product AS p 
    ON i.ProductID = p.ProductID
WHERE i.LocationID BETWEEN 3 AND 4
ORDER BY i.LocationID;
GO

Dies ist das Resultset.

ProductID   Name                   LocationID   Quantity Rank
----------- ---------------------- ------------ -------- ----
494         Paint - Silver         3            49       1
495         Paint - Blue           3            49       1
493         Paint - Red            3            41       3
496         Paint - Yellow         3            30       4
492         Paint - Black          3            17       5
495         Paint - Blue           4            35       1
496         Paint - Yellow         4            25       2
493         Paint - Red            4            24       3
492         Paint - Black          4            14       4
494         Paint - Silver         4            12       5
 (10 row(s) affected)

B.Ordnen aller Zeilen in einem Resultset

Im folgenden Beispiel werden die ersten zehn nach ihrem Gehalt geordneten Mitarbeiter zurückgegeben. Da keine PARTITION BY-Klausel angegeben wurde, wurde die RANK-Funktion auf alle Zeilen im Resultset angewendet.

USE AdventureWorks2012
SELECT TOP(10) BusinessEntityID, Rate, 
       RANK() OVER (ORDER BY Rate DESC) AS RankBySalary
FROM HumanResources.EmployeePayHistory AS eph1
WHERE RateChangeDate = (SELECT MAX(RateChangeDate) 
                        FROM HumanResources.EmployeePayHistory AS eph2
                        WHERE eph1.BusinessEntityID = eph2.BusinessEntityID)
ORDER BY BusinessEntityID;

Dies ist das Resultset.

BusinessEntityID Rate                  RankBySalary
---------------- --------------------- --------------------
1                125.50                1
2                63.4615               4
3                43.2692               8
4                29.8462               19
5                32.6923               16
6                32.6923               16
7                50.4808               6
8                40.8654               10
9                40.8654               10
10               42.4808               9

Siehe auch

Verweis

DENSE_RANK (Transact-SQL)

ROW_NUMBER (Transact-SQL)

NTILE (Transact-SQL)

Rangfolgefunktionen (Transact-SQL)

Integrierte Funktionen (Transact-SQL)