【发布时间】:2023-03-11 20:03:02
【问题描述】:
Oracle 中给定三个表 Dates(date aDate, doUse boolean), Days(rangeId int, day int, qty int) 和 Range(rangeId int, startDate date)
我想加入这些,以便 Range 与来自 aDate = startDate 的 Dates 加入其中,其中 doUse = 1 whith 每天以 Days 为单位。
给定一个范围,它可能会做这样的事情
SELECT rangeId, aDate, CASE WHEN doUse = 1 THEN qty ELSE 0 END AS qty
FROM (
SELECT aDate, doUse, SUM(doUse) OVER (ORDER BY aDate) day
FROM Dates
WHERE aDate >= :startDAte
) INNER JOIN (
SELECT rangeId, day,qty
FROM Days
WHERE rangeId = :rangeId
) USING (day)
ORDER BY day ASC
我想要做的是查询 Range 中的所有范围,而不仅仅是一个。
问题是连接值“day”取决于要计算的范围 startDate,这给我制定查询带来了一些麻烦。
请记住,Dates 表非常大,因此我想避免从表中的第一个日期开始计算天值,而每个 Range Days 不应超过 100 天左右。
编辑:示例数据
Dates Days
aDate doUse rangeId day qty
2008-01-01 1 1 1 1
2008-01-02 1 1 2 10
2008-01-03 0 1 3 8
2008-01-04 1 2 1 2
2008-01-05 1 2 2 5
Ranges
rangeId startDate
1 2008-01-02
2 2008-01-03
Result
rangeId aDate qty
1 2008-01-02 1
1 2008-01-03 0
1 2008-01-04 10
1 2008-01-05 8
2 2008-01-03 0
2 2008-01-04 2
2 2008-01-05 5
【问题讨论】:
-
您能否填写一些示例数据,您希望得到什么结果?