SQL AVG OVER 所有观察结果
Posted
技术标签:
【中文标题】SQL AVG OVER 所有观察结果【英文标题】:SQL AVG OVER all observations 【发布时间】:2021-04-13 09:52:08 【问题描述】:我可以使用OVER
创建一个新变量:
SELECT *,
AVG(my_variable) OVER (PARTITION BY var1, var2) as agg_view_of_my_variable
FROM table
如果我想要整体平均值,即不被任何变量分区,我该怎么做?基本上是一个只包含一个唯一值 AVG(my_variable)
的新列。
我正在使用 Impala SQL,但我认为这对这个问题无关紧要。
【问题讨论】:
删除PARTITION BY var1, var2
。
【参考方案1】:
这是您的查询:
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;
如果这更快,那是因为窗口函数的实现不佳。问题是所有数据都被移动到一个节点,因为没有partition by
。这实际上不是必需的,但一些优化器不会考虑替代方案。
【讨论】:
@SAFEX 。 . .表别名不是必需的,但这是个好主意。我用在您的环境中可能更快的替代方法编辑了答案。以上是关于SQL AVG OVER 所有观察结果的主要内容,如果未能解决你的问题,请参考以下文章