Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analysplattformssystem (PDW)
SQL-analysslutpunkt i Microsoft Fabric
Lager i Microsoft Fabric
SQL-databas i Microsoft Fabric
Returnerar rangen för varje rad inom partitionen av en resultatmängd. Rangen på en rad är en plus antalet rang som kommer före den aktuella raden.
ROW_NUMBER och RANK är liknande.
ROW_NUMBER numren är alla rader i följd (till exempel 1, 2, 3, 4, 5).
RANK ger samma numeriska värde för oavgjort (till exempel 1, 2, 2, 4, 5).
Anmärkning
RANK är ett temporärt värde som beräknas när frågan körs. För att behålla tal i en tabell, se IDENTITET (Egenskap) och SKAPA SEKVENS.
Transact-SQL syntaxkonventioner
Syntax
RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )
Arguments
ÖVER ( [ partition_by_clause ] order_by_clause )
partition_by_clause delar in resultatmängden som klausulen producerar FROM i partitioner där funktionen tillämpas. Om det inte anges behandlar funktionen alla rader i frågeresultatuppsättningen som en enda grupp.
order_by_clause avgör ordningen på data innan funktionen tillämpas.
order_by_clause krävs. Klausulen <rows or range clause>OVER kan inte specificeras för RANK funktionen. Mer information finns i SELECT - OVER-satsen.
Returtyper
bigint
Anmärkningar
Om två eller flera rader delar en rang får varje delad rad samma rang. Till exempel, om de två bästa säljarna har samma SalesYTD värde, rankas de båda som ett. Säljaren med näst högst SalesYTD rankas som nummer tre, eftersom det finns två rader som är rankade högre. Därför returnerar RANK funktionen inte alltid på varandra följande heltal.
Den sorteringsordning som används för hela frågan bestämmer i vilken ordning raderna visas i en resultatuppsättning.
RANK är nondeterministisk. Mer information finns i deterministiska och icke-terministiska funktioner.
Examples
Kodexemplen i den här artikeln använder AdventureWorks2025- eller AdventureWorksDW2025-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.
A. Rangrader inom en partition
Följande exempel rangordnar produkterna i lagret av de angivna lagerplatserna enligt deras kvantiteter. Resultatmängden är uppdelad av LocationID och logiskt ordnad av Quantity. På plats 3 har produkterna 494 och 495 samma kvantitet. Eftersom de är lika är båda rankade ett.
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;
Här är resultatet.
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. Rangordna alla rader i en resultatuppsättning
Följande exempel visar de tio bästa anställda rankade efter deras lön. Eftersom en PARTITION BY klausul inte är specificerad RANK tillämpas funktionen på alla rader i resultatmängden.
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;
Här är resultatet.
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
Exempel: Azure Synapse Analytics and Analytics Platform System (PDW)
C: Rangordna rader inom en partition
Följande exempel rangordnar säljrepresentanterna i varje försäljningsområde enligt deras totala försäljning. Radmängden är uppdelad av SalesTerritoryGroup och sorterad efter 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;
Här är resultatet.
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