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:http://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.