SQL窗口函数解决多维排名问题_组合排序实战

张开发
2026/4/19 7:13:56 15 分钟阅读

分享文章

SQL窗口函数解决多维排名问题_组合排序实战
rank() 跳号并列后空位dense_rank() 连续编号不跳号row_number() 强制唯一序号分组需 PARTITION BYNULL 排序需 NULLS LAST窗口函数不可用于 WHERE。rank() 和 dense_rank() 差在哪一查排名就错多维排序时用 rank() 得到“1,1,3,3,5”这种跳号结果但业务要的是“1,1,2,2,3”——这不是数据错了是函数选错了。dense_rank() 才是连续编号的正确选择rank() 会为并列项腾出后续位置row_number() 则强行打乱序号哪怕值相同。常见错误现象ORDER BY score DESC 后发现同一分数被分到不同名次或导出报表时“第2名”直接消失。按部门分组内排名必须写 PARTITION BY dept_id漏掉就变成全表排了排序字段含 NULL默认排最前若要排最后得加 NULLS LASTPostgreSQL/Oracle 支持MySQL 8.0 不支持多个排序条件写成 ORDER BY salary DESC, hire_date ASC别用逗号隔开两个 ORDER BYMySQL 8.0 窗口函数报错 “This function is not allowed in this context”不是语法错是 MySQL 对窗口函数的使用位置极其敏感不能出现在 WHERE、GROUP BY 或普通子查询里只能在 SELECT 列表或 HAVING 中直接调用。典型翻车场景想筛出“部门内薪资前3的员工”写了 WHERE dense_rank() OVER (...) —— 直接报错。正确做法套一层子查询或 CTE先算排名再在外层 WHERE 过滤CTE 写法更清晰WITH ranked AS (SELECT *, dense_rank() OVER (PARTITION BY dept_id ORDER BY salary DESC) rnk FROM emp)MySQL 8.0 不支持 RANGE BETWEEN别抄 PostgreSQL 文档里的高级帧定义多字段组合排序时 order by 的字段顺序影响最终排名窗口函数的 ORDER BY 不是“先按 A 排、再按 B 排”的简单叠加而是构建一个复合排序键。A 字段相同时才比较 B但只要 A 不同B 完全不参与当前行的名次判定。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手依托大模型帮助用户记录、整理和分析音视频内容体验用大模型做音视频笔记、整理会议记录。

更多文章