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