SQL如何在分组查询中包含所有行数据_使用窗口函数OVER PARTITION

GROUP BY后查不到非聚合字段的原始值是因SQL标准要求SELECT列须在GROUP BY中或为聚合结果;窗口函数如ROW_NUMBER()可按PARTITION BY分组排序取最新行,但需注意NULL分组、排序确定性等细节。为什么 GROUP BY 后查不到非聚合字段的原始值因为标准 SQL 要求 SELECT 列要么是 GROUP BY 的字段,要么是聚合函数(如 MAX()、COUNT())的结果。直接写 SELECT id, name, COUNT(*) FROM t GROUP BY type 会报错:column "id" must appear in the GROUP BY clause or be used in an aggregate function。这不是数据库"限制",而是语义问题:同一组里有多个 id,数据库不知道你要哪一条。窗口函数能绕过这个限制------它不改变行数,只是给每行"附加工具计算结果":OVER (PARTITION BY type) 表示按 type 分组计算,但保留原表每一行每行仍能访问自己的 id、name,同时拿到该 type 组的统计值常见误用:把 OVER 当成 GROUP BY 的替代品去"去重"或"收缩结果集",其实它完全不收缩怎么用 ROW_NUMBER() / RANK() / FIRST_VALUE() 配合 PARTITION BY 取分组内某行数据想在分组中取"每个 type 最新一条记录"?不能靠 GROUP BY + MAX(created_at) 再关联回去------太绕且易错。直接用窗口函数定位:ROW_NUMBER() OVER (PARTITION BY type ORDER BY created_at DESC):给每组内按时间倒序编号,1 就是最新那条FIRST_VALUE(id) OVER (PARTITION BY type ORDER BY created_at DESC):直接取每组最新记录的 id(注意:需搭配 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 才稳定,否则默认窗口可能只到当前行)别用 RANK() 取"第一条"------并列时会返回多个 1,而 ROW_NUMBER() 强制唯一排序示例(取每组最新完整行): 稿定AI 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能

相关推荐
小兔崽子去哪了5 分钟前
深度学习 2 / CNN 神经网络
后端·python
weixin_4407305014 分钟前
队列QUEUE介绍+类型示例(先进先出、后进先出、优先级高先出、双端进入、生产者+消费者线程)
python·线程·queue
这个DBA有点耶15 分钟前
数据库数据同步解决方案怎么选?6款主流工具横向对比与信创选型指南
数据库·架构·dba
这是程序猿17 分钟前
Java线程池深度剖析:源码原理、核心参数、任务调度与生产调优实战
java·开发语言·python
Web3&Basketball22 分钟前
ChatGPT 路由自证:跨客户端实测对照
python·大模型·agent·推理·推理优化
Patrick在香港23 分钟前
Claude 工作提醒自动化:香港天文台四个接口三个「更新时间」,警告到期了却还在生效
python·api·claude·数据抓取·香港
刃神太酷啦23 分钟前
Redis 核心进阶:哨兵、集群、缓存问题与分布式锁详解----《Hello Redis!》(6)
linux·c语言·数据库·c++·redis·分布式·缓存
小雷信息医学24 分钟前
不会写复杂代码也能发 SCI?手把手教你用 InSpireR 交互系统一键提取、合并与导出临床科研宽表【第三章】
数据库
用户83562907805128 分钟前
Python 实现 Word 文档域的插入与管理
后端·python
quantdash_cc29 分钟前
从数据采集到策略消费,股票日内行情管道应该怎么设计?
开发语言·python·数据分析·量化交易·股票数据·quantdash