Delen via


DENSE_RANK (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

Deze functie geeft de rangorde van elke rij terug binnen een partitie van de resultaatverzameling, zonder gaten in de rangschikkingswaarden. De rang van een specifieke rij is één plus het aantal verschillende rangwaarden dat vóór die specifieke rij komt.

Transact-SQL syntaxis-conventies

Syntaxis

DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )  

Arguments

<partition_by_clause>
Eerst verdeelt de door de FROM-clausule geproduceerde resultaatset in partitities, waarna de DENSE_RANK functie op elke partitie wordt toegepast. Zie OVER-clausule (Transact-SQL) voor de syntaxis PARTITION BY .

<order_by_clause>
Bepaalt de volgorde waarin de DENSE_RANK functie van toepassing is op de rijen in een partitie.

Retourtypen

bigint

Opmerkingen

Als twee of meer rijen dezelfde rangwaarde hebben in dezelfde partitie, krijgt elk van die rijen dezelfde rang. Als bijvoorbeeld de twee topverkopers dezelfde SalesYTD-waarde hebben, hebben ze allebei een rangwaarde van één. De verkoper met de volgende hoogste SalesYTD heeft een rangwaarde van twee. Dit is één groter dan het aantal verschillende rijen die voor de betreffende rij komen. Daarom hebben de getallen die door de DENSE_RANK functie worden teruggegeven geen gaten en hebben ze altijd opeenvolgende rangwaarden.

De sorteervolgorde die voor de hele query wordt gebruikt, bepaalt de volgorde van de rijen in de resultaatset. Dit impliceert dat een rij met nummer één niet de eerste rij in de partitie hoeft te zijn.

DENSE_RANK is niet-deterministisch. Zie Deterministische en Niet-deterministische Functies voor meer informatie.

Voorbeelden

Eén. Rijen rangschikken binnen een partitie

Dit voorbeeld rangschikt de producten in de voorraad, op de gespecificeerde voorraadlocaties, op basis van hun hoeveelheden. DENSE_RANK partitioneert de resultaatverzameling door LocationID en ordent logisch de resultaatverzameling door Quantity. Let op dat producten 494 en 495 dezelfde hoeveelheid hebben. Omdat ze allebei dezelfde hoeveelheidswaarde hebben, hebben ze allebei een rangwaarde van één.

USE AdventureWorks2022;  
GO  
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity  
    ,DENSE_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;  
GO  

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       2  
496         Paint - Yellow                     3          30       3  
492         Paint - Black                      3          17       4  
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  
  
(10 row(s) affected)  
  

B. Alle rijen in een resultaatset rangschikken

Dit voorbeeld geeft de top tien werknemers terug, gerangschikt op basis van hun salaris. Omdat de SELECT instructie geen PARTITION BY clausule specificeerde, gold de DENSE_RANK functie voor alle resultaatsetrijen.

USE AdventureWorks2022;  
GO  
SELECT TOP(10) BusinessEntityID, Rate,   
       DENSE_RANK() OVER (ORDER BY Rate DESC) AS RankBySalary  
FROM HumanResources.EmployeePayHistory;  

Hier is het resultatenoverzicht.

BusinessEntityID Rate                  RankBySalary  
---------------- --------------------- --------------------  
1                125.50                1  
25               84.1346               2  
273              72.1154               3  
2                63.4615               4  
234              60.0962               5  
263              50.4808               6  
7                50.4808               6  
234              48.5577               7  
285              48.101                8  
274              48.101                8  

C. Vier rangschikkingsfuncties die in dezelfde zoekopdracht worden gebruikt

Dit voorbeeld toont de vier rangschikkingsfuncties

gebruikt in dezelfde query. Zie elke rangschikkingsfunctie voor functie-specifieke voorbeelden.

USE AdventureWorks2022;  
GO  
SELECT p.FirstName, p.LastName  
    ,ROW_NUMBER() OVER (ORDER BY a.PostalCode) AS "Row Number"  
    ,RANK() OVER (ORDER BY a.PostalCode) AS Rank  
    ,DENSE_RANK() OVER (ORDER BY a.PostalCode) AS "Dense Rank"  
    ,NTILE(4) OVER (ORDER BY a.PostalCode) AS Quartile  
    ,s.SalesYTD  
    ,a.PostalCode  
FROM Sales.SalesPerson AS s   
    INNER JOIN Person.Person AS p   
        ON s.BusinessEntityID = p.BusinessEntityID  
    INNER JOIN Person.Address AS a   
        ON a.AddressID = p.BusinessEntityID  
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0;  

Hier is het resultatenoverzicht.

Voornaam Achternaam Rijnummer Rang Dichte rang Kwartiel SalesYTD Postcode
Michael Blythe 1 1 1 1 4557045.0459 98027
Tsing Mitchell 2 1 1 1 5200475.2313 98027
Jillian Carson 3 1 1 1 3857163.6332 98027
Garrett Vargas 4 1 1 1 1764938.9859 98027
Tsvi Reiter 5 1 1 2 2811012.7151 98027
Shu Ito 6 6 2 2 3018725.4858 98055
José Saraiva 7 6 2 2 3189356.2465 98055
David Campbell 8 6 2 3 3587378.4257 98055
Tete Mensa-Annan 9 6 2 3 1931620.1835 98055
Lynn Tsoflias 10 6 2 3 1758385.926 98055
Rachel Valdez 11 6 2 4 2241204.0424 98055
Jae Pak 12 6 2 4 5015682.3752 98055
Ranjit Varkey Chudukatil 13 6 2 4 3827950.238 98055

Voorbeelden: Azure Synapse Analytics and Analytics Platform System (PDW)

D: Rangschikking van rijen binnen een partitie

Dit voorbeeld rangschikt de vertegenwoordigers in elk verkoopgebied op basis van hun totale verkopen. DENSE_RANK deelt de rijverzameling op door SalesTerritoryGroup, en sorteert de resultaatverzameling door SalesAmountQuota.

-- Uses AdventureWorks  
  
SELECT LastName, SUM(SalesAmountQuota) AS TotalSales, SalesTerritoryGroup,  
    DENSE_RANK() OVER (PARTITION BY SalesTerritoryGroup ORDER BY SUM(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 SalesPersonFlag = 1 AND SalesTerritoryGroup != N'NA'  
GROUP BY LastName, SalesTerritoryGroup;  

Hier is het resultatenoverzicht.

 LastName          TotalSales     SalesTerritoryGroup  RankResult  
----------------  -------------  -------------------  --------  
Pak               10514000.0000  Europe               1  
Varkey Chudukatil  5557000.0000  Europe               2  
Valdez             2287000.0000  Europe               3  
Carson            12198000.0000  North America        1  
Mitchell          11786000.0000  North America        2  
Blythe            11162000.0000  North America        3  
Reiter             8541000.0000  North America        4  
Ito                7804000.0000  North America        5  
Saraiva            7098000.0000  North America        6  
Vargas             4365000.0000  North America        7  
Campbell           4025000.0000  North America        8  
Ansman-Wolfe       3551000.0000  North America        9  
Mensa-Annan        2753000.0000  North America        10  
Tsoflias           1687000.0000  Pacific              1 

Zie ook

RANG (Transact-SQL)
ROW_NUMBER (Transact-SQL)
NTILE (Transact-SQL)
Classificatiefuncties (Transact-SQL)
Functies