ROW_NUMBER()必须配合PARTITION BY和ORDER BY才能实现分组取首条,单独使用仅生成全局序号;正确写法需在子查询中指定分组与排序,并将WHERE条件下推至内层以提升性能。ROW_NUMBER() 必须配合 PARTITION BY 和 ORDER BY 才能分组取首条单独写 ROW_NUMBER() 不会自动按某列分组,不加 PARTITION BY 就变成全表编号,根本不是"每组首条"。常见错误是只写 ORDER BY,结果得到的是全局序号,一查就发现所有记录的 rn 都是 1 到 N 连续值,完全没分组。正确做法是明确指定分组字段和排序逻辑:SELECT * FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY user_id ORDER BY created_at DESC ) AS rn FROM orders) t WHERE rn = 1;PARTITION BY user_id 表示"每个 user_id 算一组"ORDER BY created_at DESC 决定哪条是"首条"------这里取最新订单;若要最早,改用 ASC外层 WHERE rn = 1 是必须的,窗口函数不能直接在 WHERE 中过滤ORDER BY 字段缺失索引会导致全表扫描数据库执行 ROW_NUMBER() 时,如果 ORDER BY 的字段没索引,尤其是大表上,性能会断崖式下跌。不是慢一点,是可能从毫秒级跳到几秒甚至超时。比如按 created_at 排序却没建索引,MySQL 或 PostgreSQL 都得临时排序整个分区数据,内存不够还会落盘,IO 成瓶颈。检查执行计划:看是否出现 Using filesort(MySQL)或 Sort 节点(PostgreSQL)复合索引更有效:对 PARTITION BY a ORDER BY b,优先建 (a, b) 联合索引注意 NULL 处理:如果 ORDER BY 字段允许 NULL,且业务要求 NULL 排最后,显式写 ORDER BY col DESC NULLS LAST(PostgreSQL 支持,MySQL 8.0+ 可用 IS NULL 模拟)替代方案:用 DISTINCT ON(PostgreSQL)或 FIRST_VALUE(通用但有陷阱)DISTINCT ON 在 PostgreSQL 里是更轻量的写法,语义清晰、通常更快,但它只存在于 PostgreSQL,跨数据库不可移植。 RedClaw 百度推出的手机端万能AI Agent助手
相关推荐
明志数科11 分钟前
人形机器人格斗场景下的技术挑战:动力学控制、感知融合与实时决策酉鬼女又兒13 分钟前
零基础入门 DeepSeek V4 Pro API 开发:从环境搭建、消息格式规范到翻译函数实战、少样本提示、多轮对话聊天机器人与常见报错全流程详解指南笨蛋不要掉眼泪17 分钟前
MySQL架构揭秘:MVCC解决读一致性问题Navicat中国1 小时前
开发者入门:无服务器数据库梅雅达编程笔记2 小时前
编程启蒙|Scratch 转 Python 系列第9天:字典/哈希表积木双向对照(AI大模型参数配置表实战)whn19773 小时前
如何避免以root用户执行达梦zhz52143 小时前
GIS项目中空间参考转换与MBTiles偏移:问题成因、解法与避坑brave_zhao3 小时前
openEuler下安装tar包解压工具天选之子1233 小时前
DuckDB学习KaMeidebaby4 小时前
卡梅德生物技术快报|如何制备单克隆抗体:小众禽类靶点单抗制备实操流程:双载体抗原交叉筛选完整工艺记录