PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

calcolare la somma dei valori associati agli intervalli di date sovrapposti

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.