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 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能

相关推荐
@Mike@19 分钟前
02-数据库学习笔记(SQL引擎)
数据库·笔记·学习
我的xiaodoujiao1 小时前
快速学习Python基础知识详细图文教程9--函数进阶
开发语言·python·学习·测试工具
笃行3502 小时前
国产化落地避坑 · 干货向|Oracle 迁金仓 KES,我把外连接消除排在隐性陷阱第一位
数据库
weixin_408099672 小时前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
老纪的技术唠嗑局2 小时前
花一年时间整理出的:AI 数据库混合搜索入门实践
数据库
去码头整点薯条ing2 小时前
某当网登录滑块【协议+OCR】
爬虫·python·ocr
川石课堂软件测试3 小时前
安全测试|常见SQL注入攻击方式、实例及预防
服务器·数据库·sql·功能测试·测试工具·安全·单元测试
笃行3503 小时前
国产化落地避坑 · 干货向|迁移后那条「测试能过、一上生产就查空」的 SQL,多半栽在 WHERE 函数顺序上
数据库
赶紧写完去睡觉3 小时前
Anaconda 创建虚拟环境与使用
python·pycharm·conda
迷途呀3 小时前
Python:函数中的参数类型
开发语言·笔记·python·langchain·nlp