如何对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
相关产品推荐
相关产品推荐

