所有观测值的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…表别名不是必需的,但这是一个好主意。我用一个在您的环境中可能更快的备选方案编辑了答案。