我能找到上个月的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
我可以找到的另一种方法是进行自连接,但我希望避免性能问题。
2条答案
按热度按时间sigwle7e1#
将分区by子句更改为
TRUNC(ADD_MONTHS(D_DATE,-1),'MM')
-或者ADD_MONTHS(TRUNC(D_DATE,'MM'),-1)
-为该分区提供不同的值,但与普通分区完全相同TRUNC(D_DATE,'MM')
.如果您想获得当前月份之前的最后一个mtd,可以将现有查询作为子查询并使用
lag()
:db<>小提琴
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;