Hier ist mein Versuch, dieses Problem zu lösen:
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
Die innerste Unterabfrage sammelt alle Grenzdaten mithilfe von union
in einem Satz , und sortiert sie dann.
Dann erstellt die äußere Unterabfrage neue Bereiche aus benachbarten Datumsangaben unter Verwendung von lead
Funktion.
Am Ende werden diese neuen Bereiche mit der Quelltabelle in der Hauptabfrage verknüpft, aggregiert und sum
berechnet.
BEARBEITEN
Die order by
-Klausel in der innersten Abfrage ist redundant und kann übersprungen werden, da lead(x) over
caluse ordnet Datensätze nach Datum, und eine Ergebnismenge aus der innersten Unterabfrage muss nicht sortiert werden.