SQL Server DENSE_RANK() 函数使用指南
在 SQL Server 中, DENSE_RANK()
函数是一种排名函数,它可为查询结果集中的每个行分配一个排名值。和 RANK()
函数类似, DENSE_RANK()
函数也按照指定的排序规则对查询结果集进行排序,并给每行分配一个排名值。不同的是, DENSE_RANK()
函数会跳过相同的排名值,即使有相同的排名值,也不会留下间隔。这使得 DENSE_RANK()
函数可以生成具有连续排名值的排名列表。
语法
DENSE_RANK()
函数的语法如下:
DENSE_RANK() OVER (
[ PARTITION BY partition_expression , ... [ n ] ]
ORDER BY order_expression [ ASC | DESC ] , ... [ n ] )
其中,PARTITION BY
子句指定分组条件,ORDER BY
子句指定排序条件。
使用场景
DENSE_RANK()
函数通常用于以下场景:
- 排名某个数据集合并保留重复值,同时不留空缺
- 在给定数据集合中查找某一行的排名
- 在数据集合中查找某一行的相对排名
示例
假设有如下的 sales
表:
id | name | amount |
---|---|---|
1 | John | 1000 |
2 | Alice | 2000 |
3 | Tom | 1500 |
4 | Jack | 2000 |
5 | Lucy | 1500 |
6 | Bob | 1000 |
示例 1
查询 sales
表中每个人的排名,并按照销售额降序排列:
SELECT name, amount, DENSE_RANK() OVER (ORDER BY amount DESC) AS rank
FROM sales;
查询结果如下:
name | amount | rank |
---|---|---|
Alice | 2000 | 1 |
Jack | 2000 | 1 |
Tom | 1500 | 2 |
Lucy | 1500 | 2 |
John | 1000 | 3 |
Bob | 1000 | 3 |
示例 2
查询 sales
表中每个人的排名,并按照姓名升序排列:
SELECT name, amount, DENSE_RANK() OVER (ORDER BY name ASC) AS rank
FROM sales;
查询结果如下:
name | amount | rank |
---|---|---|
Alice | 2000 | 1 |
Bob | 1000 | 2 |
Jack | 2000 | 3 |
John | 1000 | 4 |
Lucy | 1500 | 5 |
Tom | 1500 | 6 |
结论
DENSE_RANK()
函数是一种非常实用的排名函数,它可以为每个分组内的行分配排名,排名相同的行将获得相同的排名,且没有跳过的排名。与 RANK() 和 ROW_NUMBER() 函数不同,它不会跳过排名,因此它可以为具有相同值的行分配相同的排名。