我想做一个窗口函数(如 SUM() OVER() 函数),但有两个问题:
- 我想考虑最近 3 个月的移动总金额,但行数不一致。有些月份有 3 个条目,其他月份可能有 2、4、5 等;
- 还有一个“组”列,移动总和应仅对同一组的金额进行求和。
总之,a 有一个具有以下结构的表:
因此,我想添加一个移动总和列,其中包含过去 3 个月每组的金额总和。总和不应每 3 个月重置一次,而应仅考虑 3 个月前且同一组的先前值。
最终结果应如下所示:
了解此示例中求和如何工作的最佳示例是第 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/