Hãy thử điều này:
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. Đối với tôi, dường như điểm duy nhất để giữ tất cả Dates
này trong cơ sở dữ liệu là để có được một lịch liên tục với các ngày lễ được đánh dấu.
Bạn có thể tạo lịch có độ dài tùy ý trong Oracle bằng cách sử dụng cấu trúc sau:
SELECT :startDate + ROWNUM
FROM dual
CONNECT BY
1 = 1
WHERE rownum < :length
và chỉ giữ các ngày lễ trong Dates
. Một phép tham gia đơn giản sẽ cho bạn biết Dates
nào là ngày lễ và không.