Freigeben über


RANG (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-Analyseendpunkt in Microsoft FabricLagerhaus in Microsoft FabricSQL-Datenbank in Microsoft Fabric

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.

ROW_NUMBER und RANK sind ähnlich. ROW_NUMBER nummeriert alle Zeilen sequenziell (z.B. 1, 2, 3, 4, 5). RANK stellt den gleichen numerischen Wert für gleichwertige Werte bereit (z.B. 1, 2, 3, 4, 5).

Hinweis

RANK ist ein temporärer Wert, der berechnet wird, wenn die Abfrage ausgeführt wird. Um Zahlen in einer Tabelle zu erhalten, siehe IDENTITY (Property) und CREATE SEQUENCE.

Transact-SQL-Syntaxkonventionen

Syntax

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )

Argumente

ÜBER ( [ partition_by_clause ] order_by_clause )

Die partition_by_clause teilt die von der Klausel FROM erzeugte Ergebnismenge 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. order_by_clause ist erforderlich. Die der <rows or range clause> Klausel OVER kann für die Funktion RANK nicht angegeben werden. Weitere Informationen finden Sie unter SELECT - OVER-Klausel.

Rückgabetypen

bigint

Bemerkungen

Wenn zwei oder mehr Zeilen gleichwertig sind, erhält jede gleichwertige Zeile denselben Rang. Zum Beispiel, wenn die beiden Top-Verkäufer denselben SalesYTD Wert haben, werden beide als eins bewertet. Der Verkäufer mit dem nächsthöchsten SalesYTD Rang ist auf Platz drei, da es zwei höher eingestufte Reihen gibt. Daher gibt die RANK Funktion nicht immer aufeinanderfolgende 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.

RANK ist nicht deterministisch. Weitere Informationen finden Sie unter Deterministische und nicht deterministische Funktionen.

Beispiele

Die Codebeispiele in diesem Artikel verwenden die AdventureWorks2025- oder AdventureWorksDW2025 Beispieldatenbank, die Sie von der Microsoft SQL Server Samples and Community Projects Homepage herunterladen können.

A. Rangzeilen 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. An Standort 3 haben die Produkte 494 und 495 dieselbe Menge. Weil sie gleichauf stehen, sind beide auf Platz eins eingestuft.

USE AdventureWorks2025;
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;

Hier sehen Sie das Ergebnis.

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

B. Reihen alle Zeilen in einer Ergebnismenge ein

Das folgende Beispiel zeigt die Top 10 Mitarbeiter, geordnet nach ihrem Gehalt. Da eine PARTITION BY Klausel nicht spezifiziert ist, wird die RANK Funktion auf alle Zeilen der Ergebnismenge angewendet.

USE AdventureWorks2025;
GO

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;

Hier sehen Sie das Ergebnis.

BusinessEntityID Rate                  RankBySalary
---------------- --------------------- --------------------
1                125.50                1
2                63.4615               4
3                43.2692               11
4                29.8462               28
5                32.6923               22
6                32.6923               22
7                50.4808               6
8                40.8654               14
9                40.8654               14
10               42.4808               13

Beispiele: Azure Synapse Analytics und Analytics-Plattformsystem (PDW)

C: Ordnen von Zeilen innerhalb einer Partition

Im folgenden Beispiel wird die Rangfolge der Vertriebsmitarbeiter in jedem Vertriebsgebiet auf Grundlage von deren Gesamtumsatz bestimmt. Das Rowset wird auf der Grundlage von SalesTerritoryGroup partitioniert und nach SalesAmountQuota sortiert.

-- Uses AdventureWorks
SELECT e.LastName,
       st.SalesTerritoryGroup,
       SUM(sq.SalesAmountQuota) AS TotalSales,
       RANK() OVER (PARTITION BY st.SalesTerritoryGroup ORDER BY SUM(sq.SalesAmountQuota) DESC) AS RankResult
FROM dbo.DimEmployee AS e
     INNER JOIN dbo.FactSalesQuota AS sq
         ON e.EmployeeKey = sq.EmployeeKey
     INNER JOIN dbo.DimSalesTerritory AS st
         ON e.SalesTerritoryKey = st.SalesTerritoryKey
WHERE e.SalesPersonFlag = 1
      AND st.SalesTerritoryGroup <> N'NA'
GROUP BY e.LastName, st.SalesTerritoryGroup;

Hier sehen Sie das Ergebnis.

LastName           SalesTerritoryGroup  TotalSales   RankResult
------------------ -------------------- ------------ -----------
Pak                Europe               10514000.00  1
Varkey Chudukatil  Europe               5557000.00   2
Valdez             Europe               2287000.00   3
Carson             North America        12198000.00  1
Mitchell           North America        11786000.00  2
Blythe             North America        11162000.00  3
Reiter             North America        8541000.00   4
Ito                North America        7804000.00   5
Saraiva            North America        7098000.00   6
Vargas             North America        4365000.00   7
Campbell           North America        4025000.00   8
Ansman-Wolfe       North America        3551000.00   9
Mensa-Annan        North America        2753000.00   10
Tsoflias           Pacific              1687000.00   1