sql - 计算过去 X 个月的移动总和(或 SUM OVER),但行数不规则

标签 sql postgresql

我想做一个窗口函数(如 SUM() OVER() 函数),但有两个问题:

  1. 我想考虑最近 3 个月的移动总金额,但行数不一致。有些月份有 3 个条目,其他月份可能有 2、4、5 等;
  2. 还有一个“组”列,移动总和应仅对同一组的金额进行求和。

总之,a 有一个具有以下结构的表:

<表类=“s-表”> <标题> id 日期 组 金额 <正文> 1 2022-01 A组 1100 2 2022-01 D组 2500 3 2022-02 A组 3000 4 2022-02 B组 1000 5 2022-02 C组 2500 6 2022-03 A组 2000 7 2022-04 C组 1000 8 2022-05 A组 1500 9 2022-05 D组 2000 10 2022-06 B组 1000

因此,我想添加一个移动总和列,其中包含过去 3 个月每组的金额总和。总和不应每 3 个月重置一次,而应仅考虑 3 个月前且同一组的先前值。

最终结果应如下所示:

<表类=“s-表”> <标题> id 日期 组 金额 moving_sum_third_months <正文> 1 2022-01 A组 1100 1100 2 2022-01 D组 2500 2500 3 2022-02 A组 3000 4100 4 2022-02 B组 1000 1000 5 2022-02 C组 2500 2500 6 2022-03 A组 2000 6100 7 2022-04 C组 1000 3500 8 2022-05 A组 1500 3500 9 2022-05 D组 2000 2000 10 2022-06 B组 1200 1200

了解此示例中求和如何工作的最佳示例是第 8 行。

  • 它只考虑第 8 行和第 6 行的总和,因为它们是唯一符合条件的行;
  • 第 1 行和第 3 行不符合标准,因为它们距第 8 行日期已超过 3 个月;
  • 所有其他行均不属于 A 组,因此也被排除在总和之外。

有什么想法吗?预先感谢您的帮助!

最佳答案

使用SUM()作为窗口函数,通过group对窗口进行分区在RANGE模式。使用 INTERVAL '3 months' 将帧设置为返回当前记录之前 3 个月,例如

SELECT *, SUM(amount) OVER w AS moving_sum_three_months
FROM t
WINDOW w AS (PARTITION BY "group" ORDER BY "date"
             RANGE BETWEEN INTERVAL '3 months' PRECEDING AND CURRENT ROW)
ORDER BY id

演示: db<>fiddle

关于sql - 计算过去 X 个月的移动总和(或 SUM OVER),但行数不规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73129867/

相关文章:

sql - 按两列排序但只有一个订单

postgresql - postgreSQL 9.3 中的动态表名

postgresql - 在 postgresql 9.4 的查询中的 where 条件中使用多个 OR 运算符时,使用 pg_trgm 模块的索引不起作用

postgreSQL fatal error 窗口

c# - LINQ to Entities 尝试投影两个表并将它们聚合

mysql - 选择满足 SQL 条件的元组列表

sql - FULL JOIN 和 INNER JOIN 之间的区别

sql - 如何将 unix 时间戳转换为带时区的日期?

mysql - 更新表中的多个值

SQL 列为 "View Column"