SQL 所有观察结果的平均值

SQL AVG OVER all observations

我可以使用 OVER 创建一个新变量:

SELECT *,
AVG(my_variable) OVER (PARTITION BY var1, var2) as agg_view_of_my_variable
FROM table

如果我想要总体平均值,即不按任何变量划分,我该怎么做?基本上是一个仅包含一个唯一值的新列 AVG(my_variable).

我正在使用 Impala SQL,但我认为这对这个问题无关紧要。

这是您的查询:

SELECT t.*,
       AVG(my_variable) OVER (PARTITION BY var1, var2) as agg_view_of_my_variable
FROM table t

如所写,这会将数据分成由 var1var2 的唯一值定义的组。计算每个组内的平均值。

如果您想要整体平均值,那么您不想将数据分成任何组。这只是通过省略表达式的 partition by 部分来表示:

SELECT t.*,
       AVG(my_variable) OVER () as agg_view_of_my_variable
FROM table t;

在您的环境中,子查询可能更快:

select t.*, x.overall_avg
from table t cross join
     (select avg(my_variable) as overall_avg from t) x;

如果速度更快,那是因为 window 函数的实现不佳。问题是所有数据都移动到一个节点,因为没有 partition by。这实际上不是必需的,但一些优化器不考虑替代方案。