teradata - 计算前 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)
解决方案
不幸的是,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 或时间序列聚合步骤。
推荐阅读
- spring-boot - 如何使用 JPA 为非主键自动生成 UUID 值
- drake - 在 Drake 中查看碰撞模型
- download - 使用 Blazor 从网络上的共享文件夹下载文件
- python - “列表”对象没有属性“文本”
- javascript - vue @click 功能只有一半有效?
- javascript - 禁用默认(选中所有父复选框) kendo-ui
- mongodb - 在 AWS 中查询数据以实现最小延迟的最佳方式
- c# - 从 Outlook 获取唯一 ID 电子邮件
- microsoft-graph-api - Graph Api 大于运算符作为大于或等于
- python - 从多个 excel 文件中读取并将它们插入到 PosgreSQL DB 中的表中