Här är mitt försök att lösa det här problemet:
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
Den innersta underfrågan samlar alla gränsdatum i en uppsättning med union
, sedan sorterar dem.
Då bygger den yttre underfrågan nya intervall från angränsande datum med lead
funktion.
I slutändan kopplas dessa nya intervall till källtabellen i huvudfrågan, aggregerade och sum
beräknas.
EDITorder by
satsen i den innersta frågan är redundant och kan hoppas över, eftersom lead(x) over
caluse ordnar poster efter datum, och en resultatuppsättning från den innersta underfrågan behöver inte sorteras.