Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance Azure SQL
Azure Synapse Analytics
Analytics Platform System (PDW)
Koncový bod analýzy SQL v Microsoft Fabric
Sklad v Microsoft Fabric
Databá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.
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