Voici ma tentative pour résoudre ce problème :
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
Démo :https://sqlfiddle.com/#!15/ef6cb/13
La sous-requête la plus interne collecte toutes les dates limites en un seul ensemble à l'aide de union , puis les trie.
Ensuite, la sous-requête externe crée de nouvelles plages à partir de dates adjacentes en utilisant lead fonction.
En fin de compte, ces nouvelles plages sont jointes à la table source dans la requête principale, agrégées et sum est calculé.
MODIFIER
Le order by La clause dans la requête la plus interne est redondante et peut être ignorée, car lead(x) over caluse classe les enregistrements par dates, et un jeu de résultats de la sous-requête la plus profonde n'a pas besoin d'être trié.