微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我在这 2 个 SQL 查询中得到不同的结果?单独使用 AVG 与使用 over() 时

如何解决为什么我在这 2 个 SQL 查询中得到不同的结果?单独使用 AVG 与使用 over() 时

使用 AVG()

SELECT
    c.id,c.name,m.season,m.home_goal,m.away_goal,AVG(m.home_goal + m.away_goal) AS overall_avg
FROM 
    country AS c
LEFT JOIN 
    match AS m ON c.id = m.country_id
WHERE 
    name = 'Belgium'
GROUP BY 
    c.id,m.away_goal
 

使用 OVER()

SELECT
    c.id,AVG(m.home_goal + m.away_goal) OVER() AS overall_avg
FROM 
    country AS c
LEFT JOIN 
    match AS m ON c.id = m.country_id 

对于平均列,我得到了不同的结果。我不明白有什么区别。

解决方法

在您的第一个 GROUP BY 查询中,AVG(m.home_goal + m.away_goal) 是一个 聚合 函数,它将返回每个组的平均值。在第二个非 GROUP BY 查询中,AVG(m.home_goal + m.away_goal) OVER() 是一个 window 函数,它将返回整个的平均值。

,

忽略您的第二个查询中缺少 where 条件(只是您问题中的一个错误?),它们是根本不同的。

通过使用 group by 子句,结果按分组列的不同唯一组合进行分组,将所有相似行折叠为一个,对于这些组中的每一个,avg() - 和任何其他聚合函数也 - 分别对这些组中的行进行操作。

在第二个查询中,没有发生行分组,因此返回每一行。使用带有 avg() 子句的 over 函数称为 window 函数,其中所讨论的窗口(基本上是行的限定范围)由over 子句; () 表示窗口是整个结果集,每一行取所有行的平均值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。