Versuchen Sie Folgendes:
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. Es scheint mir, dass der einzige Punkt ist, all diese Dates
einzuhalten in der Datenbank ist ein fortlaufender Kalender mit gekennzeichneten Feiertagen zu erhalten.
Sie können in Oracle mit folgender Konstruktion einen Kalender beliebiger Länge generieren:
SELECT :startDate + ROWNUM
FROM dual
CONNECT BY
1 = 1
WHERE rownum < :length
und behalte nur Feiertage in Dates
. Ein einfacher Beitritt zeigt Ihnen, welche Dates
Feiertage sind und welche nicht.