Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL Analytics-eindpunt in Microsoft Fabric
Magazijn in Microsoft Fabric
SQL-database in Microsoft Fabric
Geeft de rangorde van elke rij terug binnen de partitie van een resultaatset. De rang van een rij is één plus het aantal rangen dat vóór de betreffende rij komt.
ROW_NUMBER en RANK zijn vergelijkbaar.
ROW_NUMBER Alle rijen worden achtereenvolgens geteld (bijvoorbeeld 1, 2, 3, 4, 5).
RANK geeft dezelfde numerieke waarde voor gelijken (bijvoorbeeld 1, 2, 2, 4, 5).
Opmerking
RANK is een tijdelijke waarde die wordt berekend wanneer de query wordt uitgevoerd. Om getallen in een tabel te behouden, zie IDENTITEIT (Eigenschap) en CREATE SEQUENCE.
Transact-SQL syntaxis-conventies
Syntaxis
RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )
Arguments
OVER ( [ partition_by_clause ] order_by_clause )
De partition_by_clause verdeelt de door de FROM clausule geproduceerde resultaatset in partities waarop de functie wordt toegepast. Als deze niet is opgegeven, behandelt de functie alle rijen van de queryresultatenset als één groep.
De order_by_clause bepaalt de volgorde van de gegevens voordat de functie wordt toegepast. De order_by_clause is vereist. De <rows or range clause> van de OVER clausule kan niet worden gespecificeerd voor de RANK functie. Zie SELECT - OVER-component voor meer informatie.
Retourtypen
bigint
Opmerkingen
Als twee of meer rijen gelijk zijn voor een rang, krijgt elke gelijke rij dezelfde rang. Als de twee beste verkopers dezelfde SalesYTD waarde hebben, worden ze allebei één geplaatst. De verkoper met de volgende hoogste SalesYTD ranglijst staat op nummer drie, omdat er twee rijen zijn die hoger gerangschikt zijn. Daarom geeft de RANK functie niet altijd opeenvolgende gehele getallen terug.
De sorteervolgorde die voor de hele query wordt gebruikt, bepaalt de volgorde waarin de rijen in een resultaatset voorkomen.
RANK is niet-deterministisch. Zie Deterministische en niet-deterministische functiesvoor meer informatie.
Voorbeelden
De codevoorbeelden in dit artikel gebruiken de AdventureWorks2025 of AdventureWorksDW2025 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .
Eén. Rangrijen binnen een partitie
Het volgende voorbeeld rangschikt de producten in de voorraad, de gespecificeerde voorraadlocaties op basis van hun hoeveelheden. De resultaatverzameling is gepartitioneerd door LocationID en logisch geordend door Quantity. Op locatie 3 hebben producten 494 en 495 dezelfde hoeveelheid. Omdat ze gelijk staan, staan ze allebei op één ranglijst.
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 is het resultatenoverzicht.
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. Rangschik alle rijen in een resultaatset
Het volgende voorbeeld geeft de top 10 medewerkers terug, gerangschikt op basis van hun salaris. Omdat een PARTITION BY clausule niet is gespecificeerd, wordt de RANK functie toegepast op alle rijen in de resultaatset.
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 is het resultatenoverzicht.
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
Voorbeelden: Azure Synapse Analytics and Analytics Platform System (PDW)
C: Rangschikking van rijen binnen een partitie
Het volgende voorbeeld rangschikt de verkoopvertegenwoordigers in elk verkoopgebied op basis van hun totale omzet. De rijset wordt gepartitioneerd door SalesTerritoryGroup en gesorteerd door SalesAmountQuota.
-- 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 is het resultatenoverzicht.
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