DENSE_RANK (Transact-SQL)

返回结果集分区中行的排名,在排名中没有任何间断。 行的排名等于所讨论行之前的所有排名数加一。

适用范围:SQL Server(SQL Server 2008 至当前版本),Windows Azure SQL Database(初始版本至当前版本)。

主题链接图标 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 函数返回的数字没有间断,并且始终具有连续的排名。

整个查询所用的排序顺序确定了各行在结果中的显示顺序。 这说明排名第一的行可以不是分区中的第一行。

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.对结果集中的所有行排名

下面的示例返回按薪金排名的前十名员工。 因为未指定 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)