什么是 RANK 和 DENSE_RANK?
在 SQL 中,RANK() 和 DENSE_RANK() 都是窗口函数(Window Functions),用于对查询结果进行排名。
它们常用于处理需要排序并分配名次的场景,如学生成绩排名、销售排行榜等。
核心区别
- RANK():当出现相同值时,会跳过后续名次。例如,两个第一名后直接是第三名。
- DENSE_RANK():当出现相同值时,不会跳过名次。例如,两个第一名后是第二名。
示例数据
假设有如下成绩表:
+----+--------+-------+ | id | name | score | +----+--------+-------+ | 1 | Alice | 95 | | 2 | Bob | 90 | | 3 | Carol | 95 | | 4 | David | 85 | +----+--------+-------+
使用 RANK()
SELECT name, score,
RANK() OVER (ORDER BY score DESC) AS rank_num
FROM scores;
结果:
+--------+-------+----------+ | name | score | rank_num | +--------+-------+----------+ | Alice | 95 | 1 | | Carol | 95 | 1 | | Bob | 90 | 3 | | David | 85 | 4 | +--------+-------+----------+
使用 DENSE_RANK()
SELECT name, score,
DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank_num
FROM scores;
结果:
+--------+-------+----------------+ | name | score | dense_rank_num | +--------+-------+----------------+ | Alice | 95 | 1 | | Carol | 95 | 1 | | Bob | 90 | 2 | | David | 85 | 3 | +--------+-------+----------------+
如何选择?
- 如果你需要“跳过名次”的传统竞赛式排名(如奥运奖牌榜),使用 RANK()。
- 如果你希望名次连续、不跳过(如产品星级评分排名),使用 DENSE_RANK()。