什么是 DENSE_RANK?
DENSE_RANK() 是 SQL 标准中的一个窗口函数(Window Function),用于为结果集中的每一行分配一个排名。与 RANK() 不同的是,DENSE_RANK() 在遇到相同值时不会跳过后续排名,而是保持连续。
基本语法
DENSE_RANK() OVER ( [PARTITION BY partition_expression, ... ] ORDER BY sort_expression [ASC | DESC], ... )
使用示例
假设有一个销售表 sales:
| employee | sales | |----------|-------| | Alice | 200 | | Bob | 150 | | Carol | 200 | | Dave | 100 |
执行以下查询:
SELECT employee, sales, DENSE_RANK() OVER (ORDER BY sales DESC) AS dense_rank FROM sales;
结果如下:
| employee | sales | dense_rank | |----------|-------|------------| | Alice | 200 | 1 | | Carol | 200 | 1 | | Bob | 150 | 2 | | Dave | 100 | 3 |
DENSE_RANK vs RANK vs ROW_NUMBER
- ROW_NUMBER():为每一行分配唯一序号,即使值相同。
- RANK():相同值获得相同排名,但会跳过后续名次(如 1,1,3)。
- DENSE_RANK():相同值获得相同排名,且不跳过后续名次(如 1,1,2)。
适用场景
DENSE_RANK 常用于以下场景:
- 竞赛排名(如并列第二后是第三而非第四)
- 销售排行榜
- 学生成绩排名
- 需要连续排名的数据分析任务