DENSE_RANK (Transact-SQL)

傳回結果集資料分割內之資料列次序,次序中沒有任何間距。 資料列次序是一個加上相關資料列前面之相異次序的數目。

主題連結圖示 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

請參閱

參考

RANK (Transact-SQL)

ROW_NUMBER (Transact-SQL)

NTILE (Transact-SQL)

次序函數 (Transact-SQL)

內建函數 (Transact-SQL)