DENSE_RANK (Transact-SQL)
傳回結果集資料分割內之資料列次序,次序中沒有任何間距。 資料列次序是一個加上相關資料列前面之相異次序的數目。
語法
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 函數所傳回的數目不會有間距,次序一律是連續的。
整個查詢的排序順序決定了資料列在結果中的出現順序。 這暗示著次序編號第一的資料列,並不一定是資料分割中的第一個資料列。
範例
A.排序資料分割中的資料列
下列範例會根據庫存產品數量,排列指定的庫存位置之庫存產品次序。 LocationID 分割結果集,而 Quantity 邏輯地排序結果集。 請注意產品 494 和 495 具相同的數量。 因為它們綁在一起,且它們同時排名為一。
USE AdventureWorks2012;
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 位員工。 因為沒有指定 PARTITION BY 子句,所以 DENSE_RANK 函數會套用到結果集中的所有資料列。
USE AdventureWorks2012;
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