Aquí está mi intento de resolver este 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
Demostración:http://sqlfiddle.com/#!15/ef6cb/13
La subconsulta más interna recopila todas las fechas límite en un conjunto mediante union
, luego los ordena.
Luego, la subconsulta externa crea nuevos rangos a partir de fechas adyacentes usando lead
función.
Al final, estos nuevos rangos se unen a la tabla de origen en la consulta principal, se agregan y sum
se calcula.
EDITAR
El order by
La cláusula en la consulta más interna es redundante y se puede omitir, porque lead(x) over
caluse ordena los registros por fechas y no es necesario ordenar un conjunto de resultados de la subconsulta más interna.