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
| WITH t 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
),
e AS (SELECT ABS(montant) mt, SUM(CASE WHEN montant < 0 THEN 1 ELSE 0 END) - SUM(CASE WHEN montant > 0 THEN 1 ELSE 0 END) nbKO
FROM t
GROUP BY ABS(montant)
HAVING SUM(CASE WHEN montant < 0 THEN 1 ELSE 0 END) > SUM(CASE WHEN montant > 0 THEN 1 ELSE 0 END)
)
SELECT date_a, montant
FROM (SELECT t.date_a, t.montant, e.nbKO, row_number() OVER (PARTITION BY montant ORDER BY date_a desc) rn
FROM e, t
WHERE t.montant = -e.mt
)
WHERE rn <= nbKO |
Partager