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

正如所写,这会将数据分成由 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;

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

【讨论】:

@SAFEX 。 . .表别名不是必需的,但这是个好主意。我用在您的环境中可能更快的替代方法编辑了答案。

以上是关于SQL AVG OVER 所有观察结果的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 中使用 Over 和 Partition

SAS / PROC SQL - 只要有重复(不只是删除重复),删除BY组中的所有观察

SQL语句——17统计函数

存在匹配时排除不匹配行的 SQL 多对多连接

sql 开窗函数

SQL / Postgres join where子句