Вы можете использовать предложение range
, но с аналитической функцией sum
следующим образом:
- обновлено -
SQL> WITH employee_assets (adate , account , division , amount )
2 AS
3 (SELECT TO_DATE('20190331','YYYYMMDD') , 123 , 'AB0' , 100 FROM DUAL UNION ALL
4 SELECT TO_DATE('20190331','YYYYMMDD') , 123 , 'AB1' , 110 FROM DUAL UNION ALL
5 SELECT TO_DATE('20190331','YYYYMMDD') , 123 , 'AB2' , 120 FROM DUAL UNION ALL
6 SELECT TO_DATE('20190228','YYYYMMDD') , 123 , 'AB4' , 100 FROM DUAL UNION ALL
7 SELECT TO_DATE('20190228','YYYYMMDD') , 123 , 'AB1' , 100 FROM DUAL UNION ALL
8 SELECT TO_DATE('20190228','YYYYMMDD') , 123 , 'AB2' , 100 FROM DUAL UNION ALL
9 SELECT TO_DATE('20190131','YYYYMMDD') , 123 , 'AB0' , 100 FROM DUAL UNION ALL
10 SELECT TO_DATE('20181130','YYYYMMDD') , 123 , 'ABX' , 500 FROM DUAL)
11 SELECT
12 X.ADATE, X.ACCOUNT, X.CURRENT_MONTH_SUM,
13 SUM(CURRENT_MONTH_SUM) OVER(
14 PARTITION BY ACCOUNT
15 ORDER BY
16 AMONTH
17 RANGE BETWEEN 1 PRECEDING AND 1 PRECEDING
18 ) PREVIOUS_MONTH_SUM
19 FROM
20 (
21 SELECT
22 ADATE,
23 ACCOUNT,
24 SUM(AMOUNT) CURRENT_MONTH_SUM,
25 TO_NUMBER(TO_CHAR(ADATE, 'YYYYMM')) AS AMONTH
26 FROM
27 EMPLOYEE_ASSETS
28 GROUP BY
29 ADATE,
30 ACCOUNT
31 ) X
32 ORDER BY
33 ADATE DESC
34 ;
ADATE ACCOUNT CURRENT_MONTH_SUM PREVIOUS_MONTH_SUM
--------- ---------- ----------------- ------------------
31-MAR-19 123 330 300
28-FEB-19 123 300 100
31-JAN-19 123 100
30-NOV-18 123 500
SQL>
Cheers !!