上月mtd

zvokhttg  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(193)

我能找到上个月的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

但是,当我添加\u months-1来获得pmtd时,它仍然显示当前的mtd
我试过了

SUM(TOTAL_UNIT)OVER( PARTITION BY PRODUCT, TRUNC(ADD_MONTHS(D_DATE,-1),'MM') ORDER BY D_DATE )MTD

我可以找到的另一种方法是进行自连接,但我希望避免性能问题。

sigwle7e

sigwle7e1#

将分区by子句更改为 TRUNC(ADD_MONTHS(D_DATE,-1),'MM') -或者 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<>小提琴

dzhpxtsq

dzhpxtsq2#

这是因为在分析函数中使用add\u months。所以你要做的是计算总和,按月份划分,就像上个月一样。。虽然最后一部分对我来说意义不大,但它确实给出了正确的总和,但是您没有告诉sql也显示上个月的结果。
如果您想将d\ U日期显示为上个月,请添加另一列 trunc( ADD_MONTHS( d_date, -1), 'MM') as pmtd ```
select trunc( ADD_MONTHS( sysdate, -1), 'MM') from dual;

这将总是给你上个月的第一个日期。

相关问题