इसे आजमाएं:
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)
पी. एस. मुझे ऐसा लगता है कि इन सभी Dates
को रखने का एकमात्र बिंदु डेटाबेस में चिह्नित छुट्टियों के साथ एक सतत कैलेंडर प्राप्त करना है।
आप निम्नलिखित निर्माण का उपयोग करके Oracle में मनमानी लंबाई का कैलेंडर उत्पन्न कर सकते हैं:
SELECT :startDate + ROWNUM
FROM dual
CONNECT BY
1 = 1
WHERE rownum < :length
और केवल छुट्टियों को Dates
. में रखें . एक साधारण जुड़ाव आपको दिखाएगा कि कौन सी Dates
छुट्टियां हैं और कौन सी नहीं।