在 SQL 中,RANK() 和 DENSE_RANK() 是两种常用的窗口函数(Window Function),用于对查询结果进行排名。它们在处理相同值(并列)时的行为不同,这是理解二者区别的关键。
RANK() 会为相同的值分配相同的排名,但**跳过后续排名**。例如,如果有两个第一名,则下一个排名是第三名。
SELECT
name, score,
RANK() OVER (ORDER BY score DESC) AS rank
FROM students;
DENSE_RANK() 同样为相同的值分配相同的排名,但**不会跳过后续排名**。例如,两个第一名之后,下一个是第二名。
SELECT
name, score,
DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank
FROM students;
| 姓名 | 分数 | RANK() | DENSE_RANK() |
|---|---|---|---|
| 张三 | 95 | 1 | 1 |
| 李四 | 95 | 1 | 1 |
| 王五 | 90 | 3 | 2 |
| 赵六 | 85 | 4 | 3 |
- 如果你需要“标准竞赛排名”(即并列后跳过名次),使用 RANK()。
- 如果你希望排名连续、不跳号(如排行榜展示),使用 DENSE_RANK()。