Hier is mijn poging om dit probleem op te lossen:
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
Demo:https://sqlfiddle.com/#!15/ef6cb/13
De binnenste subquery verzamelt alle grensdatums in één set met behulp van union , sorteert ze vervolgens.
Vervolgens bouwt de buitenste subquery nieuwe bereiken van aangrenzende datums met behulp van lead functie.
Uiteindelijk worden deze nieuwe bereiken samengevoegd met de brontabel in de hoofdquery, geaggregeerd en sum wordt berekend.
EDIT
De order by clausule in de binnenste query is overbodig en kan worden overgeslagen, omdat lead(x) over caluse ordent records op datum en een resultatenset van de binnenste subquery hoeft niet te worden gesorteerd.