为什么我在这 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是整个结果集,每一行取所有行的平均值。
使用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是整个结果集,每一行取所有行的平均值。