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

Denna funktion returnerar rangen för varje rad inom en resultatmängdspartition, utan luckor i rangvärdena. Rangen för en specifik rad är en plus antalet olika rangvärden som kommer före just den raden.

Transact-SQL syntaxkonventioner

Syntax

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

Arguments

<partition_by_clause>
Först delar den resultatmängden som produceras av FROM-klausulen i partitioner, och sedan DENSE_RANK tillämpas funktionen på varje partition. Se OVER-satsen (Transact-SQL) för syntaxen PARTITION BY .

<order_by_clause>
Bestämmer ordningen i vilken DENSE_RANK funktionen gäller för raderna i en partition.

Returtyper

bigint

Anmärkningar

Om två eller fler rader har samma rangvärde i samma partition, kommer varje rad att få samma rang. Till exempel, om de två främsta säljarna har samma SalesYTD-värde, kommer båda att ha ett rankningsvärde på ett. Säljaren med näst högst Försäljning hittills kommer att ha ett rankningsvärde på två. Detta överstiger antalet distinkta rader som kommer före den aktuella raden med en. Därför har de tal som funktionen returnerar DENSE_RANK inga luckor och har alltid på varandra följande rangvärden.

Sorteringsordningen som används för hela frågan bestämmer ordningen på raderna i resultatuppsättningen. Detta innebär att en rad med nummer ett inte behöver vara första raden i partitionen.

DENSE_RANK är nondeterministisk. Se Deterministiska och icke-deterministiska funktioner för mer information.

Examples

A. Rangordning av rader inom en partition

Detta exempel rangordnar produkterna i lager, efter angivna lagerplatser, baserat på deras kvantiteter. DENSE_RANK delar upp resultatuppsättningen med LocationID och ordnar logiskt resultatmängden med Quantity. Observera att produkterna 494 och 495 har samma kvantitet. Eftersom de båda har samma kvantitetsvärde har de båda ett rangvärde på ett.

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  

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       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. Rangordna alla rader i ett resultatset

Detta exempel visar de tio bästa anställda rankade efter deras lön. Eftersom satsen SELECT inte specificerade en PARTITION BY klausul, DENSE_RANK tillämpades funktionen på alla resultatmängdsrader.

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

Här är resultatet.

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. Fyra rangordningsfunktioner som används i samma fråga

Detta exempel visar de fyra rangordningsfunktionerna

Används i samma fråga. Se varje rangordningsfunktion för funktionsspecifika exempel.

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;  

Här är resultatet.

Förnamn Efternamn Radnummer Rangordning Tät rang Kvartil Försäljning i år Postnummer
Michael Blythe 1 1 1 1 4557045.0459 98027
Karin 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

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

D: Rangordning av rader inom en partition

Detta exempel rangordnar säljrepresentanterna i varje försäljningsområde enligt deras totala försäljning. DENSE_RANK delar radmängden med SalesTerritoryGroup, och sorterar resultatmängden med 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;  

Här är resultatet.

 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 

Se även

RANG (Transact-SQL)
ROW_NUMBER (Transact-SQL)
NTILE (Transact-SQL)
Rankningsfunktioner (Transact-SQL)
Funktioner