SQL统计各分组中排名前三的记录_使用窗口函数RANK

RANK() 遇相同值并列且跳号,如三个第1名后直接第4名;若仅用 WHERE rank ≤ 3 过滤,会漏掉并列第3名之后实际应入选的并列名次,导致结果偏少而非偏多------题干"多出几条"通常源于误将 RANK() 与 ROW_NUMBER() 混淆或未正确处理分组边界。用 RANK() 统计每组前三名时,为什么结果总多出几条?因为 RANK() 遇到相同值会并列且跳号,比如三个并列第1名后,下一个是第4名。如果你只写 WHERE rank ,可能实际返回5条甚至更多记录------只要它们都卡在"第1名"或"第2名"这种并列位置上。真实场景中,用户要的是"最多三条",不是"所有排名≤3的",这时该用 DENSE_RANK() 或加限制逻辑RANK() 适合强调名次断层(如"冠军、亚军、季军,之后是第五名"),不适合取固定数量MySQL 8.0+、PostgreSQL、SQL Server 都支持,但 SQLite 默认不支持窗口函数(需 3.25+ 且编译时启用)怎么写出真正每组只取三条的 SQL?核心是先算排名,再对每个分组做行数截断。别在 WHERE 里直接筛 RANK(),而要用子查询或 CTE 包一层:SELECT user_id, dept, scoreFROM ( SELECT user_id, dept, score, RANK() OVER (PARTITION BY dept ORDER BY score DESC) AS rk FROM users_score) tWHERE t.rk <= 3;必须把 RANK() 放在子查询或 CTE 里,否则窗口函数不能出现在 WHERE 中排序字段如果有 NULL,默认排在最前(PostgreSQL)或最后(MySQL),建议显式写 ORDER BY score DESC NULLS LAST(如果数据库支持)如果某组只有两条数据,RANK() 仍只返回这两条,不会补空行RANK() 和 ROW_NUMBER() 在取前三时差别有多大?差别在是否容忍并列:用 ROW_NUMBER() 每组一定返回最多三条,但相同分数会被强行拆成第1、第2、第3;用 RANK() 则保留业务意义上的并列,但数量不可控。 稿定AI 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能

相关推荐
Warson_L18 小时前
高性能架构设计
python·go
databook19 小时前
新数据到手,先跑哪几步检查
python·数据分析
czq_268671948719 小时前
Python打卡第46天
开发语言·python
Flynt21 小时前
日涨4000星的OSINT工具,我拿Linus的用户名和一个随机字符串实测了一遍
python·安全
Zan21 小时前
SQLite + SQLx 实战:为什么已经发布的数据库迁移文件,绝对不能再修改?
数据库·后端·面试
这个DBA有点耶1 天前
数据同步的三个工程底线:DDL同步、断点续传、一致性校验——开源CDC的边界与KFS的路径
数据库·dba·代码规范
SelectDB1 天前
列式存储为什么适合分析类负载?原理、限制与日志场景应用
数据库
曲径海盗1 天前
【Python 学习第 53 天】列表基础
python·学习笔记·编程入门
Dumbness1 天前
群里 @ 机器人发"查订单",指令一条都没命中:微信群机器人在路由前漏掉的几步归一化
python·微信