Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Verwaltete Azure SQL-Instanz
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL-Analyseendpunkt in Microsoft Fabric
Lagerhaus in Microsoft Fabric
SQL-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