记录 | 属性 | 日期 | MONTH | AMT | CML AMT |
---|---|---|---|---|---|
1 | A | 1/1/2021 | 1 | 10 | 10 |
2 | A | 2/1/2021 | 2 | 10 | 20 |
3 | A | 3/1/2021 | 3 | 10 | 30 |
4 | A | 4/1/2021 | 4 | 10 | 40 |
5 | A | 5/1/2021 | 5 | 10 | 50 |
6 | A | 6/1/2021 | 6 | 10 | 60 |
7 | B | 1/1/2021 | 1 | 20 | 20 |
8 | B | 3/1/2021 | 3 | 20 | 40 |
9 | B | 5/1/2021 | 5 | 20 | 60 |
10 | B | 7/1/2021 | 7 | 20 | 80 |
11 | B | 9/1/2021 | 9 | 20 | 80 |
12 | B | 11/1/2021 | 11 | 20 | 80 |
13 | C | 1/1/2021 | 1 | 30 | 30 |
14 | C | 8/1/2021 | 8 | 30 | 30 |
15 | C | 9/1/2021 | 9 | 30 | 60 |
我希望使用 AMT 列计算过去 6 个月的累积总和(CML AMT 列)。 CML AMT 列应该只查看 6 个月的窗口。 如果在 6 个月的时间范围内没有相同属性的其他记录,那么它应该简单地返回 AMT 列。
我尝试了以下显然行不通的方法,因为日期/月份不一致。 任何帮助将不胜感激。
SUM(AMT)
OVER (PARTITION BY ATTRIBUTE
ORDER BY DATE
ROWS BETWEEN 4 PRECEDING AND CURRENT ROW)
答案 0 :(得分:0)
不幸的是,Teradata 不支持 RANGE
,但如果您只需要对少量值进行求和(六个月 = 最多 6 行),您可以应用暴力方法:
AMT
+
CASE WHEN LAG(DATE,1) OVER (PARTITION BY ATTRIBUTE ORDER BY DATE) >= ADD_MONTHS(DATE,-6)
THEN LAG(AMT,1) OVER (PARTITION BY ATTRIBUTE ORDER BY DATE)
ELSE 0
END
+
CASE WHEN LAG(DATE,2) OVER (PARTITION BY ATTRIBUTE ORDER BY DATE) >= ADD_MONTHS(DATE,-6)
THEN LAG(AMT,2) OVER (PARTITION BY ATTRIBUTE ORDER BY DATE)
ELSE
END
+
...
看起来很难看,但它主要是剪切&粘贴&修改,并且仍然是解释中的一步。其他可能的解决方案将基于额外的 EXPAND ON 或时间序列聚合步骤。