为什么单独使用AVG与搭配OVER()的两个SQL查询结果不同?
两个查询的核心逻辑差异如下:
- 筛选范围差异
第一个查询带有WHERE name = 'Belgium'过滤条件,仅会统计比利时对应的比赛数据;第二个查询无过滤条件,会统计所有国家关联的全部比赛数据,二者的计算样本范围完全不同。 - 普通聚合函数的分组逻辑差异
第一个查询使用的是不带窗口的标准AVG()聚合函数,必须配合GROUP BY使用:你指定的分组维度是c.id, m.season, m.home_goal, m.away_goal,这四个字段已经包含了单场比赛的主场、客场进球值,相当于每个分组仅对应单场比赛本身,计算得到的overall_avg实际就是单场比赛的总进球值,没有实现跨场的平均聚合效果。 - 窗口函数的计算逻辑差异
第二个查询使用的AVG(xxx) OVER()是窗口函数,空的OVER()子句代表全局窗口,会将整个查询结果集作为统一计算范围,得到的是所有比赛总进球的全局平均值,这个值会附在每一行结果后面,不会随分组变化;同时第二个查询没有GROUP BY子句,返回的是关联后的全部原始比赛行,和第一个查询聚合后的结果行数也不一致。
补充验证建议
你可以把第二个查询也加上WHERE name = 'Belgium'过滤条件,再把第一个查询的GROUP BY维度改成仅c.id, m.season,就可以看到对齐后的效果了。
内容的提问来源于stack exchange,提问作者Shanice Khoo
相关产品推荐
相关产品推荐

