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.对结果集中的所有行排名
下面的示例返回按薪金排名的前十名员工。 因为未指定 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