SQLPathLab
窗口函数 · 高级

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

运行结果

result
namernk
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。

标签

窗口函数

这篇内容是否清楚?