PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

calcular a soma dos valores associados a intervalos de datas sobrepostos


Aqui está minha tentativa 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

Demonstração:http://sqlfiddle.com/#!15/ef6cb/13

A subconsulta mais interna coleta todas as datas de limite em um conjunto usando union , e os classifica.
Em seguida, a subconsulta externa cria novos intervalos de datas adjacentes usando lead função.
No final, esses novos intervalos são unidos à tabela de origem na consulta principal, agregados e sum é calculado.


EDIT
O order by cláusula na consulta mais interna é redundante e pode ser ignorada, porque lead(x) over caluse ordena registros por datas e um conjunto de resultados da subconsulta mais interna não precisa ser classificado.