RANK
生成排名并保留并列间隔。
本页使用窗口函数或 CTE;MySQL 需要 8.0 及以上版本。
简介
RANK 是窗口排名函数,相同排序值获得相同名次,下一名会跳过已经占用的名次数量,例如 1、1、3。它不会合并结果行,可使用 PARTITION BY 在每个分组内重新排名。并列值需要额外稳定字段时,应明确业务是继续并列还是改用 ROW_NUMBER。
基础语法
SELECT name, RANK() OVER (ORDER BY amount DESC) AS rnk FROM orders;
示例
RANK 示例
按订单金额从高到低生成名次,并观察金额相同时 RANK 如何保留并列和名次间隔。
示例数据表
表名:
orders| name | amount |
|---|---|
| Alice | 1200 |
| Bob | 900 |
| Cindy | 1500 |
| David | 700 |
运行结果
| name | rnk |
|---|---|
| Cindy | 1 |
| Alice | 2 |
| Bob | 3 |
| David | 4 |
常见问题
窗口函数会减少结果行数吗?
不会。它在保留明细行的同时计算排名、前后值或累计结果。
排名结果为什么不稳定?
窗口 ORDER BY 存在并列值时,应增加稳定且唯一的次级排序字段。
窗口排序能保证最终展示顺序吗?
不能。需要在查询末尾再写一次 ORDER BY 才能保证输出顺序。
标签
这篇内容是否清楚?
感谢反馈,我们会把它用于后续内容复核。