DENSE_RANK (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Tato funkce vrací pořadí každého řádku v rámci rozdělení množiny výsledků, bez mezer v hodnotách pořadí. Pořadí konkrétního řádku je jedna plus počet různých hodnot pořadí, které předcházejí tomuto řádku.

Transact-SQL konvence syntaxe

Syntaxe

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

Arguments

<partition_by_clause>

Nejprve rozdělí množinu výsledků vytvořenou klauzulí FROM na oddíly, a poté DENSE_RANK se funkce aplikuje na každou oddíl. Viz OVER Clause (Transact-SQL) pro syntaxi PARTITION BY .

<order_by_clause>

Určuje pořadí, v jakém DENSE_RANK se funkce aplikuje na řádky v rozkladu.

Návratové typy

bigint

Poznámky

Pokud mají dva nebo více řádků stejnou hodnotu pořadí ve stejném rozdělení, každý z těchto řádků získá stejnou hodnotu. Například pokud mají dva nejlepší prodejci stejnou SalesYTD hodnotu, oba mají hodnotu hodnosti jedna. Prodejce s dalším nejvyšším SalesYTD hodnocením má hodnotu hodnosti dvě. Tato hodnota pořadí převyšuje počet různých řádků před daným řádkem o jednu. Proto čísla vrácená DENSE_RANK funkcí nemají mezery a vždy mají po sobě jdoucí hodnoty pořadí.

Pořadí třídění použité pro celý dotaz určuje pořadí řádků ve výsledné množině. Toto pořadí znamená, že řada na prvním místě nemusí být první řadou v rozkladu.

DENSE_RANK je nedeterministické. Další informace naleznete v tématu Deterministické a nedeterministické funkce.

Pro pokyny k ladění výkonu window function viz OVER() Aspekty výkonu.

Examples

A. Řádky pořadí v rámci rozkladu

Tento příklad řadí produkty v zásobách podle určených skladových míst podle jejich množství. DENSE_RANK rozděluje množinu výsledků podle a LocationID logicky řadí množinu výsledků podle Quantity. Produkty 494 a 495 mají stejné množství. Protože obě mají stejnou hodnotu množství, mají obě hodnotu hodnosti jedna.

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  

Tady je soubor výsledků.

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. Řadit všechny řádky ve výsledné množině

Tento příklad vrací deset nejlepších zaměstnanců podle jejich platu. Protože SELECT příkaz nespecifikuje klauzuli PARTITION BY , funkce DENSE_RANK se vztahuje na všechny řádky výsledkové množiny.

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

Tady je soubor výsledků.

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. Čtyři funkce řazení používané ve stejném dotazu

Tento příklad ukazuje čtyři funkce pořadí

použito ve stejném dotazu. Viz každá funkce hodnocení pro příklady specifické pro funkci.

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;  

Tady je soubor výsledků.

Křestní jméno Příjmení Číslo řádku Hodnost Hustá hodnost Kvartil SalesYTD PSČ
Michael Blythe 1 1 1 1 4557045.0459 98027
Linda 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 Pákistánec 12 6 2 4 5015682.3752 98055
Ranjit Varkey Chudukatil 13 6 2 4 3827950.238 98055

Příklady: Azure Synapse Analytics a Analytický platformový systém (PDW)

D: Řazení řádků v rámci partition

Tento příklad řadí obchodní zástupce v každém prodejním území podle jejich celkového prodeje. DENSE_RANK rozdělí řádkovou množinu podle SalesTerritoryGroup, a výsledek množinu podle 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;  

Tady je soubor výsledků.

 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