在 SQL 中,RANK() 和 DENSE_RANK() 是两个常用的 排名函数,它们都可以用来对数据进行降序排名,但它们的实现方式略有不同。
✅ 一、RANK() 函数
作用:
- 为每一行分配一个排名,相同值的行会获得相同的排名,但排名之间会跳过。
- 如果有相同的值,排名会跳过,即:
RANK() = 1 → 该行排名为 1,下一行如果值相同,排名为 2。
示例:
SELECT
id,
value,
RANK() OVER (ORDER BY value DESC) AS rank
FROM
your_table;
示例数据:
| id |
value |
| 1 |
100 |
| 2 |
90 |
| 3 |
90 |
| 4 |
80 |
| 5 |
80 |
| 6 |
70 |
输出结果:
| id |
value |
rank |
| 1 |
100 |
1 |
| 2 |
90 |
2 |
| 3 |
90 |
2 |
| 4 |
80 |
3 |
| 5 |
80 |
3 |
| 6 |
70 |
4 |
✅ 二、DENSE_RANK() 函数
作用:
- 为每一行分配一个排名,相同值的行会获得相同的排名,但排名之间不会跳过。
- 如果有相同的值,排名会连续。
示例:
SELECT
id,
value,
DENSE_RANK() OVER (ORDER BY value DESC) AS dense_rank
FROM
your_table;
输出结果:
| id |
value |
dense_rank |
| 1 |
100 |
1 |
| 2 |
90 |
1 |
| 3 |
90 |
1 |
| 4 |
80 |
2 |
| 5 |
80 |
2 |
| 6 |
70 |
3 |
✅ 三、总结对比
| 函数 |
排名规则 |
举例 |
RANK() |
相同值跳过,排名不连续 |
1, 2, 2, 3, 3, 4 |
DENSE_RANK() |
相同值不跳过,排名连续 |
1, 1, 1, 2, 2, 3 |
✅ 四、使用场景
✅ 五、SQL 语法示例
示例 1:使用 RANK()
SELECT
id,
value,
RANK() OVER (ORDER BY value DESC) AS rank
FROM
your_table;
示例 2:使用 DENSE_RANK()
SELECT
id,
value,
DENSE_RANK() OVER (ORDER BY value DESC) AS dense_rank
FROM
your_table;
✅ 六、注意事项
RANK() 和 DENSE_RANK() 是 窗口函数,需要在 OVER() 子句中使用。
- 两者都支持
ORDER BY,但 DENSE_RANK() 不会跳过排名。
如需进一步了解窗口函数,可以参考 SQL 标准或相关数据库文档(如 MySQL、PostgreSQL、SQL Server 等)。需要我帮你写一个完整的 SQL 示例吗?