所有观测值的SQL平均值

所有观测值的SQL平均值,sql,impala,Sql,Impala,我可以在上使用创建一个新变量: SELECT *, AVG(my_variable) OVER (PARTITION BY var1, var2) as agg_view_of_my_variable FROM table 如果我想要总体平均值,即不被任何变量分割,我该怎么做?基本上是一个只包含一个唯一值的新列AVG(my_变量) 我正在使用Impala SQL,但我认为这与这个问题无关。这是您的问题: SELECT t.*, AVG(my_variable) OVER (PAR

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

SELECT *,
AVG(my_variable) OVER (PARTITION BY var1, var2) as agg_view_of_my_variable
FROM table
如果我想要总体平均值,即不被任何变量分割,我该怎么做?基本上是一个只包含一个唯一值的新列
AVG(my_变量)

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

这是您的问题:

SELECT t.*,
       AVG(my_variable) OVER (PARTITION BY var1, var2) as agg_view_of_my_variable
FROM table t
如前所述,这会将数据分成由
var1
var2
的唯一值定义的组。在每组内计算平均值

如果需要总体平均值,则不希望将数据划分为任何组。这可以通过省略表达式的
部分来表示:

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;

如果速度更快,那是因为窗口函数的实现较差。问题是所有数据都被移动到一个节点,因为没有
分区。这实际上不是必须的,但是一些优化器不考虑替代方案。

按VAR1删除Value>分区,VAR2< /代码>。@ SAFEX…表别名不是必需的,但这是一个好主意。我用一个在您的环境中可能更快的备选方案编辑了答案。