Delen via


RANG (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricMagazijn in Microsoft FabricSQL-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