1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
WITH data AS (
SELECT TO_DATE('03/09/2017', 'DD/MM/RRRR') date_a, -3940.54 montant FROM dual
UNION ALL SELECT TO_DATE('03/12/2017', 'DD/MM/RRRR'), -5000 FROM dual
UNION ALL SELECT TO_DATE('20/12/2017', 'DD/MM/RRRR'), 3940.54 FROM dual
UNION ALL SELECT TO_DATE('20/12/2017', 'DD/MM/RRRR'), 5000 FROM dual
UNION ALL SELECT TO_DATE('04/03/2018', 'DD/MM/RRRR'), -4486.08 FROM dual
UNION ALL SELECT TO_DATE('13/03/2018', 'DD/MM/RRRR'), 4486.08 FROM dual
UNION ALL SELECT TO_DATE('03/06/2018', 'DD/MM/RRRR'), -4871.64 FROM dual
UNION ALL SELECT TO_DATE('02/09/2018', 'DD/MM/RRRR'), -5000 FROM dual
UNION ALL SELECT TO_DATE('02/12/2018', 'DD/MM/RRRR'), -5000 FROM dual
UNION ALL SELECT TO_DATE('30/12/2018', 'DD/MM/RRRR'), 4871.64 FROM dual
UNION ALL SELECT TO_DATE('30/12/2018', 'DD/MM/RRRR'), 5000 FROM dual
UNION ALL SELECT TO_DATE('30/12/2018', 'DD/MM/RRRR'), 4446.02 FROM dual
UNION ALL SELECT TO_DATE('03/03/2019', 'DD/MM/RRRR'), -5000 FROM dual
)
, odata as (
select
row_number() over(order by date_a desc, montant desc) as key, date_a, montant,
abs(montant) as amnt
from data
where montant <> 0
)
, mdata as (
select k, d, m, kp, dp, mp from odata
match_recognize (
partition by amnt order by date_a desc
measures last(N.key) as k, (P.key) as kp, last(N.date_a) as d, (P.date_a) as dp, last(N.montant) as m, (P.montant) as mp
pattern( P N+ )
define
P as montant > 0,
N as montant < 0
)
)
select date_a, montant from odata
where key not in (select k from mdata union select kp from mdata)
order by key desc
; |
Partager