RANG (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-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