Надеюсь, я правильно понял.Было бы хорошо, если бы Вы показали нам свой запрос и сообщили, как вы рассчитываете среднее состояние и откуда эти недели.В любом случае, вот запрос, который генерирует все недели для 2019 года и объединяет с вашим log
.
select to_char(wsd, 'iw') week, wsd, start_date, end_date, state
from (
select trunc(date '2019-01-01', 'iw') + level * 7 - 7 wsd
from dual
connect by trunc(date '2019-01-01', 'iw') + level * 7 <= date '2020-01-01')
left join log on wsd < end_date and start_date < wsd + 7
Интересен этот диапазон:
week week_start_date log_start log_end state
21 2019-05-20
22 2019-05-27 2019-05-28 07:12:43 2019-05-29 09:12:43 1
22 2019-05-27 2019-05-29 09:12:43 2019-06-01 08:12:43 0
23 2019-06-03
24 2019-06-10 2019-06-11 10:12:43 2019-06-12 16:12:43 1
24 2019-06-10 2019-06-12 16:12:43 2019-06-12 17:12:43 0
25 2019-06-17
Я не знаю, как вы подсчитываете среднее состояние для недель 22 и 24. Может быть, это средневзвешенное значение за вычтенное время, может быть как-тоДругой.Но это не важно, теперь у вас есть строка на 23-ю неделю с пропуском state
.Если это означает, что предыдущее значение действительно для этой недели, используйте:
nvl(state, lag(state) over (order by wsd))
или
coalesce(state, lag(state) over (order by wsd), 0)
, если вы хотите 0
в качестве значения по умолчанию, когда мы также пропускаем предыдущую неделю (недели),Если не хватает двух недель, добавьте ignore nulls
к lag
.
Затем вы можете сгруппировать данные по неделям и посчитать средние значения.
Демо-версия dbfiddle