sql - 上个月 MTD
问题描述
反正我能找到上个月的 MTD 吗?所以我的数据是日级别的,我需要找到 MTD 和上个月的 MTD
D_date product TOTAL_UNIT
01/AUG/2020 A 10
01/AUG/2020 B 20
02/AUG/2020 A 15
02/AUG/2020 B 25
29/JUL/2020 A 5
29/JUL/2020 B 0
30/JUL/2020 A 2
31/JUL/2020 B 30
我可以使用以下 SQL (Oracle) 获取当前月份的 MTD
SUM(TOTAL_UNIT)OVER( PARTITION BY PRODUCT, TRUNC(D_DATE,'MM') ORDER BY D_DATE )MTD
但是,当我执行 add_months -1 来获取 PMTD 时,它仍然显示当前的 MTD
我试着做
SUM(TOTAL_UNIT)OVER( PARTITION BY PRODUCT, TRUNC(ADD_MONTHS(D_DATE,-1),'MM') ORDER BY D_DATE )MTD
我能找到的另一种方法是进行自加入,但我想避免因为性能问题而这样做。
解决方案
将您的 partition-by 子句更改为TRUNC(ADD_MONTHS(D_DATE,-1),'MM')
- 或- 为您提供了与 plain 完全相同的组ADD_MONTHS(TRUNC(D_DATE,'MM'),-1)
的不同值TRUNC(D_DATE,'MM')
。
如果您想获得当月之前的最后一个 MTD,您可以将现有查询作为子查询并使用lag()
:
select d_date, product, total_unit, m_date, mtd,
last_value(mtd) over (partition by product order by m_date range between unbounded preceding and 1 preceding) as prev_mtd
from (
select d_date, product, total_unit,
TRUNC(D_DATE,'MM') m_date,
SUM(TOTAL_UNIT)OVER( PARTITION BY PRODUCT, TRUNC(D_DATE,'MM') ORDER BY D_DATE )MTD
from your_table
)
order by product, d_date;
D_DATE | PRODUCT | TOTAL_UNIT | M_DATE | MTD | PREV_MTD
:-------- | :------ | ---------: | :-------- | --: | -------:
29-JUL-20 | A | 5 | 01-JUL-20 | 5 | null
30-JUL-20 | A | 2 | 01-JUL-20 | 7 | null
01-AUG-20 | A | 10 | 01-AUG-20 | 10 | 7
02-AUG-20 | A | 15 | 01-AUG-20 | 25 | 7
29-JUL-20 | B | 0 | 01-JUL-20 | 0 | null
31-JUL-20 | B | 30 | 01-JUL-20 | 30 | null
01-AUG-20 | B | 20 | 01-AUG-20 | 20 | 30
02-AUG-20 | B | 25 | 01-AUG-20 | 45 | 30
推荐阅读
- python - 如何获得网状访问虚拟环境
- javascript - 用于 ReactJS 的 TinyMCE 中的图像上传和文件附件
- c# - 从字符串转换日期和/或时间时出错
- networking - 将 TCP 时间戳转换为日期
- typescript - 类型“null”不可分配给类型“T”
- cmake - 如何使用 CMake 强制对 cpp 文件进行 CUDA 编译?
- android - 在 react-native 中更新 exp-Cli
- javascript - prototype.constructor 的实际目的是什么
- json - Google Cloud HTTP 函数 - 为什么函数对 cURL json 格式如此挑剔
- webhooks - 为什么 mollie 不能调用 webhook URL?