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
如所写,这会将数据分成由 var1
和 var2
的唯一值定义的组。计算每个组内的平均值。
如果您想要整体平均值,那么您不想将数据分成任何组。这只是通过省略表达式的 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
。这实际上不是必需的,但一些优化器不考虑替代方案。
我可以使用 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
如所写,这会将数据分成由 var1
和 var2
的唯一值定义的组。计算每个组内的平均值。
如果您想要整体平均值,那么您不想将数据分成任何组。这只是通过省略表达式的 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
。这实际上不是必需的,但一些优化器不考虑替代方案。