С учетом трех таблиц Dates (date aDate, doUse boolean), Days (rangeId int, day int, qty int) и Range (rangeId int, startDate date) в Oracle
Я хочу присоединиться к ним, чтобы Range объединился с датами из aDate = startDate, где doUse = 1, каждый день в днях.
Для одного диапазона можно сделать что-то вроде этого
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, который должен быть рассчитан, что создает некоторые проблемы при формулировании запроса.
Имейте в виду, что таблица Даты довольно большая, поэтому я бы не хотел рассчитывать значение дня по первой дате в таблице, в то время как каждый диапазон Дней не должен превышать 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