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() 函数不同,它不会跳过排名,因此它可以为具有相同值的行分配相同的排名。