如何用SQL处理排名并列情况 RANK与DENSE_RANK辨析
RANK() 跳过并列后的名次如1,2,2,4DENSE_RANK() 不跳1,2,2,3ROW_NUMBER() 强制唯一编号1,2,3,4不处理并列三者均需OVER(ORDER BY...)且不可在WHERE中直接引用。遇到并列排名时RANK() 和 DENSE_RANK() 行为到底差在哪差别不在语法而在「跳名次」与否。比如三人分数为 100、95、95RANK() 给出的是 1, 2, 2然后下一个名次直接跳到 4而 DENSE_RANK() 是 1, 2, 2, 3——名次连续不跳空。常见错误现象用 RANK() 做 Top N 查询却漏掉第 3 名因为名次跳到了 4结果少了一条数据或者误以为 DENSE_RANK() 会“合并行”其实它只是不跳号每行仍独立输出。RANK()适合强调“段位感”比如“前两名并列冠军第三名是季军”这种需体现断层的场景DENSE_RANK()适合做连续分档比如按销售额分 ABC 三档A 档1、B 档2、C 档3不能缺档两者都要求写 OVER (ORDER BY ...)且仅支持窗口函数语法不支持在 WHERE 中直接引用别名为什么 ROW_NUMBER() 不算“处理并列”但它常被混用ROW_NUMBER() 根本不认重复值——哪怕两行完全一样也会硬生生编出 1, 2, 3。它解决的是“唯一编号”问题不是“逻辑排名”问题。典型误用场景想查“分数最高的前三人”用了 ROW_NUMBER() OVER (ORDER BY score DESC)结果并列第二的两人里只留下一个换成 RANK() 或 DENSE_RANK() 才能保全所有并列者。如果业务要求“最多取 3 人但允许并列导致实际返回 4 行”必须用 RANK()如果要求“严格只分 3 档不管多少人挤在第二档”选 DENSE_RANK()ROW_NUMBER() 的排序稳定性依赖 ORDER BY 子句是否包含唯一键否则结果可能每次执行都不一样RANK() 在 MySQL 8.0 和 PostgreSQL 中行为一致但旧版 MySQL 不支持MySQL 5.7 及更早版本没有窗口函数强行用会报错 ERROR 1064 (42000): You have an error in your SQL syntax。升级到 8.0 是前提。 Tellers AI Tellers是一款自动视频编辑工具可以将文本、文章或故事转换为视频。