Aqui está minha tentativa de resolver este problema:
select y,
sum( hrs_per_week )
from tmp_ranges t
join(
select daterange( x,
lead(x) over (order by x) ) As y
from (
select lower( rng ) As x
from tmp_ranges
union
select upper( rng )
from tmp_ranges
order by x
) y
) y
on t.rng && y.y
group by y
order by y
Demonstração:http://sqlfiddle.com/#!15/ef6cb/13
A subconsulta mais interna coleta todas as datas de limite em um conjunto usando
union
, e os classifica.Em seguida, a subconsulta externa cria novos intervalos de datas adjacentes usando
lead
função.No final, esses novos intervalos são unidos à tabela de origem na consulta principal, agregados e
sum
é calculado.EDIT
O
order by
cláusula na consulta mais interna é redundante e pode ser ignorada, porque lead(x) over
caluse ordena registros por datas e um conjunto de resultados da subconsulta mais interna não precisa ser classificado.