Megosztás a következőn keresztül:


DENSE_RANK (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsElemzési platformrendszer (PDW)SQL Analytics-végpont a Microsoft FabricbenRaktár a Microsoft FabricbenSQL-adatbázis a Microsoft Fabricben

Ez a függvény minden sor rangját adja vissza az eredményhalmaz partíción belül, nincs rés a rangsorolási értékekben. Egy adott sor rangja egy plusz a különböző rangértékek száma, amelyek az adott sor előtt helyezkednek el.

Transact-SQL szintaxis konvenciók

Szemantika

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

Arguments

<partition_by_clause>
Először a FROM klauzula által generált eredményhalmazt osztjuk partíciókra, majd a DENSE_RANK függvényt minden partícióra alkalmazzuk. Lásd az OVER (Transact-SQL ) záradékot PARTITION BY a szintaxisért.

<order_by_clause>
Meghatározza a függvény sorainak sorrendjét DENSE_RANK a partícióban.

Visszatérési típusok

bigint

Megjegyzések

Ha két vagy több sor azonos rangértékkel rendelkezik ugyanabban a partícióban, mindegyik sor ugyanazt a rangot kapja. Például, ha a két legjobb értékesítőnek ugyanaz a SalesYTD értéke, mindkettőjüknek egy rangértéke lesz. A következő legmagasabb SalesYTD-vel rendelkező értékesítőnek két rangértéke lesz. Ez eggyel meghaladja a sort előtti különálló sorok számát. Ezért a függvény által visszaadott DENSE_RANK számoknak nincs hézag, és mindig egymást követő rangértékek vannak.

Az egész lekérdezéshez használt rendezési sorrend határozza meg az eredményhalmaz sorainak sorrendjét. Ez azt jelenti, hogy egy első sorrendben lévő sor nem feltétlenül az első sor a partíción.

DENSE_RANK nemdeterminista. További információért lásd Determinisztikus és nemdeterminisztikus függvényeket .

Példák

A. Sorok rangsorolása egy partíción belül

Ez a példa a készletben lévő termékeket a megadott készlethelyek szerint sorolja a mennyiségük szerint. DENSE_RANKfelosztja az eredményhalmazt a-valLocationID, és logikusan sorolja az eredményhalmazt .Quantity Figyeld meg, hogy a 494 és 495 termékek ugyanannyi mennyiséget tartalmaznak. Mivel mindkettőnek ugyanaz a mennyiségi értéke, mindkettőjüknek egy rangértéke van.

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  

Itt van az eredmények összessége.

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. Az összes sor rangsorolása egy eredményhalmazban

Ez a példa a tíz legjobb alkalmazottat adja vissza, fizetésük szerint rangsorolva. Mivel az SELECT állítás nem határozott meg klauzulatot PARTITION BY , a DENSE_RANK függvény minden eredményhalmaz-sorra alkalmazódott.

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

Itt van az eredmények összessége.

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. Négy rangsorolási függvény ugyanabban a lekérdezésben

Ez a példa a négy rangsorolási függvényt mutatja

ugyanabban a lekérdezésben használták. Lásd az egyes rangsorsorolási függvényeket specifikus példákért.

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;  

Itt van az eredmények összessége.

Keresztnév Vezetéknév Sorszám Helyezés Sűrű rang Kvartilis SalesYTD Irányítószám
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
Padlásszoba 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
Dávid 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 Vörös 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

Példák: Azure Synapse Analytics and Analytics Platform System (PDW)

D: Sorok rangsorolása egy partíción belül

Ez a példa az értékesítési területek értékesítési képviselőit az összes eladásuk alapján rangsorolja. DENSE_RANKa sorhalmazt felosztja SalesTerritoryGroup, és az eredményhalmazt .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;  

Itt van az eredmények összessége.

 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 

Lásd még:

RETT (Transact-SQL)
ROW_NUMBER (Transact-SQL)
NTILE (Transact-SQL)
Rangsorolási függvények (Transact-SQL)
Funkciók