首页 > 解决方案 > 计算前 6 个月的累计金额

问题描述

记录 属性 日期 AMT CML AMT
1 一个 2021 年 1 月 1 日 1 10 10
2 一个 2021 年 2 月 1 日 2 10 20
3 一个 2021 年 3 月 1 日 3 10 30
4 一个 2021 年 4 月 1 日 4 10 40
5 一个 2021 年 5 月 1 日 5 10 50
6 一个 2021 年 6 月 1 日 6 10 60
7 2021 年 1 月 1 日 1 20 20
8 2021 年 3 月 1 日 3 20 40
9 2021 年 5 月 1 日 5 20 60
10 2021 年 7 月 1 日 7 20 80
11 2021 年 9 月 1 日 9 20 80
12 2021 年 11 月 1 日 11 20 80
13 C 2021 年 1 月 1 日 1 30 30
14 C 2021 年 8 月 1 日 8 30 30
15 C 2021 年 9 月 1 日 9 30 60

我希望使用过去 6 个月的 AMT 列计算累积总和(CML AMT 列)。CML AMT 列应该只查看 6 个月的窗口。如果在 6 个月的时间范围内没有相同属性的其他记录,则它应该简单地返回 AMT 列。

我尝试了以下显然不会工作的日期/月份不一致。任何帮助将不胜感激。

SUM(AMT)
OVER (PARTITION BY ATTRIBUTE
      ORDER BY DATE
      ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) 

标签: teradatateradata-sql-assistant

解决方案


不幸的是,Teradata 不支持RANGE,但如果您只需要对少量值求和(六个月 = 最多六行),您可以应用蛮力方法:

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


推荐阅读