首页 > 解决方案 > 上个月 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

我能找到的另一种方法是进行自加入,但我想避免因为性能问题而这样做。

标签: sqloracle

解决方案


将您的 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

db<>小提琴


推荐阅读