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

如何用SQL查询分组后late字段平均最大值对应的from字段

解决分组后获取最大平均值对应的分组值问题

嘿,我来帮你搞定这个SQL查询的问题!你的需求是找出late字段平均值最大的from值,原SQL语句没法运行是因为犯了两个常见的SQL语法逻辑错误,咱们一步步来解决。

原SQL的问题分析

你写的SELECT id FROM Record HAVING MAX(AVG(late)) GROUP BY from有两个关键问题:

  1. 子句顺序错误:SQL的执行顺序里,GROUP BY必须在HAVING之前,正确的逻辑顺序是FROM → GROUP BY → HAVING → SELECT。
  2. 聚合函数嵌套错误:不能直接在同一个SELECT层级里使用MAX(AVG(late)),因为AVG()是对分组后的结果计算,MAX()需要基于已经计算好的平均值来操作,得拆分成两步处理。

解决方案1:基础分组排序法(适用于所有数据库)

这是最直观的方法,先计算每个from的late平均值,再按平均值降序排序,取第一条记录就是我们要的结果:

SELECT `from`, AVG(late) AS avg_late
FROM Record
GROUP BY `from`
ORDER BY avg_late DESC
LIMIT 1;

注意:from是SQL的保留关键字,所以需要用反引号(MySQL)或者双引号(PostgreSQL、SQL Server)包裹,避免语法报错。

这个语句的执行逻辑:

  • 先按from字段分组,计算每个组的late平均值
  • 按平均值从高到低排序
  • 用LIMIT 1只返回排名第一的记录,也就是平均值最大的from值

解决方案2:窗口函数法(支持窗口函数的数据库,如MySQL 8+、PostgreSQL等)

如果存在多个from的平均值相同且都是最大值的情况,上面的LIMIT 1只会返回其中一个。用窗口函数可以返回所有符合条件的记录:

SELECT `from`
FROM (
    SELECT `from`,
           RANK() OVER (ORDER BY AVG(late) DESC) AS rank_num
    FROM Record
    GROUP BY `from`
) AS sub_query
WHERE rank_num = 1;

这个语句的执行逻辑:

  • 内层子查询先按from分组计算平均值,然后用RANK()窗口函数给每个分组按平均值降序排名
  • 外层查询筛选出排名为1的分组,这样如果有多个分组并列第一,都会被返回

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:46:37