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