Postgres - 如何对窗口函数列的每 x 行求和?

Posted

技术标签:

【中文标题】Postgres - 如何对窗口函数列的每 x 行求和?【英文标题】:Postgres - How to SUM every x amount of rows of a window function column? 【发布时间】:2018-03-23 18:10:01 【问题描述】:

我使用名为“avg_rev”的窗口函数创建了一个列,它给出了过去 7 天按销售区域划分的平均收入金额:

AVG(rev) OVER (PARTITION BY sales_region ROWS BETWEEN 7 PRECEDING AND CURRENT ROW) AS avg_rev

我想按天将每个销售区域返回的平均收入相加。所以对于下表:

date     | sales_region | rev    | avg_rev
---------|--------------|--------|---------
01-23-18 | US East      | 192643 | 187463
01-23-18 | US South     | 89734  | 90245
01-23-18 | US West      | 254867 | 270974
01-24-18 | US East      | 168903 | 189245
01-24-18 | US South     | 93127  | 90621
01-24-18 | US West      | 252075 | 269874

我想要另一列通过总结最后 3 行(或获得相同结果的任何其他方式)来显示每天的总平均收入,以便获得下表:

date     | sales_region | rev    | avg_rev | total_avg
---------|--------------|--------|---------|-----------
01-23-18 | US East      | 192643 | 187463  | 548682
01-23-18 | US South     | 89734  | 90245   | 548682
01-23-18 | US West      | 254867 | 270974  | 548682
01-24-18 | US East      | 168903 | 189245  | 550740
01-24-18 | US South     | 93127  | 91621   | 550740
01-24-18 | US West      | 252075 | 269874  | 550740

如您所见,总平均收入保持一致,因为它们每天的总和应该相同。

任何正确方向的帮助将不胜感激!

【问题讨论】:

【参考方案1】:

将值与SUM 聚合并包括在group by 中选择的所有其他列。

select date,sales_region,rev
,AVG(rev) OVER (PARTITION BY sales_region ROWS BETWEEN 7 PRECEDING AND CURRENT ROW) AS avg_rev
,SUM(AVG(rev)) OVER (PARTITION BY sales_region ROWS BETWEEN 7 PRECEDING AND CURRENT ROW) AS avg_sum
from tbl
group by date,sales_region,rev

【讨论】:

【参考方案2】:

如果我真的要猜你想要什么,它会是这样的:

SELECT t.*,
       SUM(avg_rev_7day) OVER (PARTITION BY date)
FROM (SELECT AVG(rev) OVER (PARTITION BY sales_region
                            ORDER BY date
                            ROWS BETWEEN 7 PRECEDING AND 1 PRECENDING
                           ) AS avg_rev_7day,

      . . .
     ) t

注意:

前 7 行和当前行之间的行实际上是 8 天,而不是 7 天。我假设你想要 7 行。 window 子句(ROWS 部分)确实需要ORDER BY。 对于您想做的事情,我认为嵌套子查询是最好的。

【讨论】:

以上是关于Postgres - 如何对窗口函数列的每 x 行求和?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Postgres 的窗口函数中获取 mode()?

postgres —— 窗口函数入门

matlab求矩阵的特征值和特征向量

Oracle SQL:如何对每行的每 x 个后续行求和

sum函数

numpy的矩阵乘法