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

如何对SQL分组AVG结果再次求平均?获取单一总平均值

解决方法:对分组结果再次求平均

当然可行!你当前的查询会先按match_id分组,计算每组legs.avg的平均值,最终返回多条分组结果。要把这些分组结果再求一次总平均、仅返回一行数据,只需要把现有查询作为子查询(或CTE),在外层再套一层AVG()聚合函数即可。

方案1:使用子查询

SELECT AVG(grouped_avg) AS overall_avg
FROM (
    SELECT AVG(legs.avg) AS grouped_avg
    FROM legs
    INNER JOIN matchs ON matchs.id = legs.match_id
    WHERE matchs.player_id = 4
    GROUP BY match_id
) AS grouped_results;

方案2:使用CTE(更易读)

如果你的数据库支持CTE(比如PostgreSQL、MySQL 8+、SQL Server等),可以用更清晰的写法:

WITH grouped_avg_results AS (
    SELECT AVG(legs.avg) AS grouped_avg
    FROM legs
    INNER JOIN matchs ON matchs.id = legs.match_id
    WHERE matchs.player_id = 4
    GROUP BY match_id
)
SELECT AVG(grouped_avg) AS overall_avg
FROM grouped_avg_results;

逻辑说明

内层的子查询/CTE会先执行:它按match_id分组,算出每个赛事对应的legs.avg平均值,生成一个包含所有分组平均值的临时结果集。外层的AVG()函数会对这个临时结果集里的所有grouped_avg值再次求平均,最终返回唯一的一行总平均值。

额外提醒:这种方式计算的是分组平均值的平均值,和直接对所有符合条件的legs.avg求全局平均是有区别的——如果每个分组的记录数不同,两个结果会存在差异。如果你实际需要的是所有符合条件的legs.avg的全局平均,可以简化成:

SELECT AVG(legs.avg) AS overall_avg
FROM legs
INNER JOIN matchs ON matchs.id = legs.match_id
WHERE matchs.player_id = 4;

但根据你的描述,你明确需要分组后的平均值再求平均,那前面的两种方案就完全匹配你的需求啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:19:59