Ecco il mio tentativo di risolvere questo problema:
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
La sottoquery più interna raccoglie tutte le date limite in un unico set utilizzando union
, quindi li ordina.
Quindi la sottoquery esterna crea nuovi intervalli da date adiacenti utilizzando lead
funzione.
Alla fine, questi nuovi intervalli vengono uniti alla tabella di origine nella query principale, aggregati e sum
viene calcolato.
EDIT
Il order by
La clausola nella query più interna è ridondante e può essere ignorata, perché lead(x) over
caluse ordina i record in base alle date e non è necessario ordinare un set di risultati dalla sottoquery più interna.