SQL GROUP BY查询报列不在聚合函数或GROUP BY子句错误求助
报错原因
你当前的SQL违反了分组查询的基础规则:使用GROUP BY做分组聚合时,SELECT列表中出现的所有非聚合计算的字段,必须全部包含在GROUP BY子句中。你写的select *会查询出SetID等所有表字段,但GROUP BY后仅声明了MoldName字段,因此直接抛出字段不合法的错误。
另外你原本的写法逻辑也和需求不匹配:该语句仅能筛选出存在多个不同SetID的MoldName分组,无法实现“取每个MoldName对应最新日期的完整记录”的需求。
实现方案
要返回表所有列、仅保留每个MoldName对应日期最新的单条记录,优先用窗口函数实现,逻辑清晰且不会出现重复数据问题:
-- 兼容SQL Server、MySQL 8.0及以上、PostgreSQL等支持窗口函数的数据库 WITH MoldSorted AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY MoldName ORDER BY 日期字段 DESC -- 替换为表中实际存储录入时间/创建日期的字段名,例如CreateTime、InputDate ) AS sort_rn FROM MoldInfo ) SELECT * FROM MoldSorted WHERE sort_rn = 1
如果使用不支持窗口函数的低版本数据库,可以用分组关联的方式实现:
SELECT m1.* FROM MoldInfo m1 JOIN ( SELECT MoldName, MAX(日期字段) AS latest_time FROM MoldInfo GROUP BY MoldName ) m2 ON m1.MoldName = m2.MoldName AND m1.日期字段 = m2.latest_time
注意:如果同一个
MoldName下存在多条记录的日期完全相同,上述关联写法会把同日期的所有记录都返回;如果要保证每个MoldName仅返回一条,可以在窗口函数的排序规则里追加主键倒序,例如ORDER BY 日期字段 DESC, SetID DESC,即可保证排序唯一。
内容的提问来源于stack exchange,提问作者Mr Singh
相关产品推荐
相关产品推荐

