Во-первых, я предупреждаю вас, чтобы вы оставили год вне расчета. Такие диапазоны дат обычно выходят за пределы года, поэтому вам следует быть осторожным.
Я думаю, что наиболее эффективный способ сделать такой расчет - это подсчитать "входы" и "выходы" из дат. Это включает в себя разделение данных, а затем повторную агрегацию.
Запрос выглядит так:
with el as (
select id,
date_trunc('week', startdate) as wk,
1 as inc
from eventlog
union all
select id,
date_trunc('week', enddate) + interval '1 week' as wk,
-1 as inc
from eventlog
)
select wk,
sum(inc) as week_net,
sum(sum(inc)) over (order by wk) as active_in_week
from el
group by wk
order by wk;
Здесь - это dbfiddle.