sql >> Base de Datos >  >> RDS >> PostgreSQL

calcular la suma de valores asociados con rangos de fechas superpuestas

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.