计算前 6 个月的累计金额

时间:2021-06-04 04:49:51

标签: teradata teradata-sql-assistant

<头>
记录 属性 日期 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) 

1 个答案:

答案 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 或时间序列聚合步骤。