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ů obdrží stejnou hodnotu. Například pokud mají dva nejlepší prodejci stejnou hodnotu SalesYTD, oba budou mít hodnotu ranku jedna. Prodejce s dalším nejvyšším SalesYTD bude mít hodnotu ranku dva. To převyšuje počet odlišný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ě. To znamená, že řádek s prvním místem nemusí být první řádek v rozdělení.
DENSE_RANK je nedeterministické. Více informací viz Deterministické a nedeterministické funkce .
Examples
A. Řazení řádků v rámci partitionu
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. Všimněte si, že 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. Řazení všech řádků ve výsledné množině
Tento příklad vrací deset nejlepších zaměstnanců podle jejich platu. Protože SELECT příkaz nespecifikoval klauzuli PARTITION BY , funkce DENSE_RANK se aplikovala 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
Viz také
HODNOST (Transact-SQL)
ROW_NUMBER (Transact-SQL)
NTILE (Transact-SQL)
Funkce řazení (Transact-SQL)
Functions