You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL按ID分组取最大Price对应行 报GROUP BY非聚合函数错误

报错原因

你触发GROUP BY clause with non aggregate functions报错的核心原因是:标准SQL的GROUP BY语法有强制约束——SELECT子句中出现的非聚合字段,必须全部包含在GROUP BY的分组字段列表中。你之前的查询里Date字段既没有使用聚合函数包裹,也没有加入GROUP BY分组条件,数据库无法确定同ID分组下应该返回哪条记录对应的Date值,因此直接抛出语法错误。

正确SQL实现方案

根据你使用的数据库版本,选择对应写法即可:

方案1:窗口函数写法(推荐,适配MySQL8.0+、PostgreSQL、SQL Server等所有支持窗口函数的数据库)

SELECT ID, Price, Date
FROM (
    SELECT
        ID,
        Price,
        Date,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Price DESC) AS row_sort
    FROM 替换为你的实际表名
) temp
WHERE row_sort = 1;
  • 逻辑说明:按ID做分区,每个分区内按Price降序排序为每行生成序号,最终只取每个ID分区内序号为1的行,就是对应Price最高的记录。如果同一个ID存在多条Price同为最大值的记录,需要把所有匹配行都返回的话,把ROW_NUMBER()替换为RANK()即可。
  • 用你提供的测试数据运行,返回结果和预期完全一致:ID=1对应Price=42、Date=b;ID=2对应Price=34、Date=a。

方案2:关联子查询写法(兼容老版本数据库,比如MySQL5.x)

SELECT t1.ID, t1.Price, t1.Date
FROM 替换为你的实际表名 t1
JOIN (
    SELECT ID, MAX(Price) AS max_price
    FROM 替换为你的实际表名
    GROUP BY ID
) t2 ON t1.ID = t2.ID AND t1.Price = t2.max_price;
  • 逻辑说明:先通过GROUP BY子查询算出每个ID对应的最高Price,再和原表做关联,匹配ID和Price同时相等的行,就能拿到最高Price对应的Date值。

内容的提问来源于stack exchange,提问作者InsDSt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 14:57:32