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

Why do I get different results in these 2 SQL queries? Using AVG alone vs. when using 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.season, m.home_goal, m.away_goal
 

使用OVER():

SELECT
    c.id,
    c.name,
    m.season,
    m.home_goal,
    m.away_goal,
    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) 是一个 聚合 函数,它将 return 每个组的平均值。在第二个非 GROUP BY 查询中,AVG(m.home_goal + m.away_goal) OVER() 是一个 window 函数,它将 return 整个 的平均值]table.

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

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

在第二个查询中,没有对行进行分组,因此返回每一行。将 avg() 函数与 over 子句一起使用称为 window 函数,其中 window 有问题(基本上是符合条件的行范围)由 over 子句指定; ()表示window是整个结果集,每一行取所有行的平均值。