DENSE_RANK
生成排名且并列后不跳号。
本页使用窗口函数或 CTE;MySQL 需要 8.0 及以上版本。
简介
DENSE_RANK 为相同排序值分配相同名次,并让下一个名次连续,不像 RANK 那样留下跳号。需要分组排名时使用 PARTITION BY;若还要在并列行之间得到稳定展示顺序,应在外层 ORDER BY 增加唯一键,但不要把该键加入排名条件。
基础语法
SELECT name, DENSE_RANK() OVER (ORDER BY amount DESC) AS rnk FROM orders;
示例
DENSE_RANK 示例
示例按 amount 降序生成连续名次;相同金额会共享名次,后续金额不会因并列而跳号。
示例数据表
表名:
orders| name | amount |
|---|---|
| Alice | 1200 |
| Bob | 900 |
| Cindy | 1500 |
| David | 700 |
运行结果
| name | rnk |
|---|---|
| Cindy | 1 |
| Alice | 2 |
| Bob | 3 |
| David | 4 |
常见问题
DENSE_RANK 与 RANK、ROW_NUMBER 有什么区别?
并列时 DENSE_RANK 名次不跳号,RANK 会跳号,ROW_NUMBER 则仍给每行唯一序号。
怎样在每个部门内重新排名?
在 OVER 中使用 PARTITION BY 部门字段,并在 ORDER BY 中定义部门内的排名依据。
窗口中的 ORDER BY 能保证最终行顺序吗?
不能。窗口排序只用于计算名次,展示结果仍应在查询末尾显式 ORDER BY。
标签
这篇内容是否清楚?
感谢反馈,我们会把它用于后续内容复核。