PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

calculer la somme des valeurs associées aux plages de dates qui se chevauchent

Voici ma tentative pour résoudre ce problème :

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

Démo :http://sqlfiddle.com/#!15/ef6cb/13

La sous-requête la plus interne collecte toutes les dates limites en un seul ensemble à l'aide de union , puis les trie.
Ensuite, la sous-requête externe crée de nouvelles plages à partir de dates adjacentes en utilisant lead fonction.
En fin de compte, ces nouvelles plages sont jointes à la table source dans la requête principale, agrégées et sum est calculé.

MODIFIER
Le order by La clause dans la requête la plus interne est redondante et peut être ignorée, car lead(x) over caluse classe les enregistrements par dates, et un jeu de résultats de la sous-requête la plus profonde n'a pas besoin d'être trié.