Essayez ceci :
SELECT rt.rangeId, aDate, CASE WHEN doUse = 1 THEN qty ELSE 0 END AS qty
FROM (
SELECT *
FROM (
SELECT r.*, t.*, SUM(doUse) OVER (PARTITION BY rangeId ORDER BY aDate) AS span
FROM (
SELECT r.rangeId, startDate, MAX(day) AS dm
FROM Range r, Days d
WHERE d.rangeid = r.rangeid
GROUP BY
r.rangeId, startDate
) r, Dates t
WHERE t.adate >= startDate
ORDER BY
rangeId, t.adate
)
WHERE
span <= dm
) rt, Days d
WHERE d.rangeId = rt.rangeID
AND d.day = GREATEST(rt.span, 1)
P. S. Il me semble que le seul point pour conserver toutes ces Dates
dans la base de données est d'obtenir un calendrier continu avec les jours fériés marqués.
Vous pouvez générer un calendrier de longueur arbitraire dans Oracle en utilisant la construction suivante :
SELECT :startDate + ROWNUM
FROM dual
CONNECT BY
1 = 1
WHERE rownum < :length
et ne garder que les jours fériés dans Dates
. Une simple jointure vous montrera quelles Dates
sont des jours fériés et qui ne le sont pas.