DENSE_RANK (Transact-SQL)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 的 SQL 端點分析 Microsoft Fabric 的倉儲
此函式會傳回結果集分割區內每個資料列的次序,次序值中沒有任何間距。 特定資料列的次序是一加上該特定資料列前面之相異次序值的數目。
語法
DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )
引數
<partition_by_clause>
首先將 FROM 子句產生的結果集分割成分割區,然後將 DENSE_RANK
函式套用至每個分割區。 如需 PARTITION BY
語法,請參閱 OVER 子句 (Transact-SQL)。
<order_by_clause>
決定將 DENSE_RANK
函式套用至分割區中資料列的順序。
傳回型別
bigint
備註
如果同一個分割區中有兩個或多個資料列具有相同的次序值,每個資料列會收到相同的次序。 例如,如果兩位頂尖銷售人員有相同的 SalesYTD 值,他們的次序值便都是一。 SalesYTD 次高之銷售人員的次序值便是二。 這會比相關資料列前面之相異資料列數目多出一。 因此,DENSE_RANK
函式所傳回的數目不會有間距,次序值一律是連續的。
整個查詢的排序順序決定資料列在結果集中的順序。 這暗示著次序編號第一的資料列,並不一定是分割區中的第一個資料列。
DENSE_RANK
不具決定性。 如需詳細資訊,請參閱決定性與非決定性函數。
範例
A. 排序分割區中的資料列
此範例會根據庫存產品數量依指定庫存位置來排列庫存產品。 DENSE_RANK
會依 LocationID
分割結果集,並依 Quantity
以邏輯方式排序結果集。 請注意產品 494 和 495 具相同的數量。 因為它們具有相同的數量值,所以其次序值都是一。
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
結果集如下所示。
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. 排序結果集中的所有資料列
此範例會依員工薪水的排序傳回前 10 位員工。 因為 SELECT
陳述式沒有指定 PARTITION BY
子句,所以 DENSE_RANK
函式會套用至所有結果集資料列。
USE AdventureWorks2022;
GO
SELECT TOP(10) BusinessEntityID, Rate,
DENSE_RANK() OVER (ORDER BY Rate DESC) AS RankBySalary
FROM HumanResources.EmployeePayHistory;
結果集如下所示。
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. 在相同查詢中使用的四個次序函式
此範例會顯示四個次序函式
可用於相同的查詢中。 如需函式特定範例,請參閱每個次序函式。
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;
結果集如下所示。
FirstName | 姓氏 | Row Number | Rank | Dense Rank | Quartile | SalesYTD | PostalCode |
---|---|---|---|---|---|---|---|
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 | 7 | 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 |
範例:Azure Synapse Analytics 和 Analytics Platform System (PDW)
D.排序分割區中的資料列
此範例會根據其總銷售額,排列每個銷售領域內的銷售代表。 DENSE_RANK
會依 SalesTerritoryGroup
分割資料列集,並依 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;
結果集如下所示。
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
另請參閱
RANK (Transact-SQL)
ROW_NUMBER (Transact-SQL)
NTILE (Transact-SQL)
次序函數 (Transact-SQL)
函數