SQLPathLab
窗口函数 · 高级

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
orders
nameamount
Alice 1200
Bob 900
Cindy 1500
David 700

运行结果

result
namernk
Cindy 1
Alice 2
Bob 3
David 4

常见问题

窗口函数会减少结果行数吗?

不会。它在保留明细行的同时计算排名、前后值或累计结果。

排名结果为什么不稳定?

窗口 ORDER BY 存在并列值时,应增加稳定且唯一的次级排序字段。

窗口排序能保证最终展示顺序吗?

不能。需要在查询末尾再写一次 ORDER BY 才能保证输出顺序。

标签

常用窗口函数

这篇内容是否清楚?