Her er mit forsøg på at løse dette problem:
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 inderste underforespørgsel samler alle grænsedatoer i ét sæt ved hjælp af union
, og sorterer dem derefter.
Derefter bygger den ydre underforespørgsel nye intervaller fra tilstødende datoer ved hjælp af lead
funktion.
I sidste ende bliver disse nye områder knyttet til kildetabellen i hovedforespørgslen, aggregeret og sum
er beregnet.
EDITorder by
klausul i den inderste forespørgsel er redundant og kan springes over, fordi lead(x) over
caluse sorterer poster efter datoer, og et resultatsæt fra den inderste underforespørgsel skal ikke sorteres.