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

beregne summen af ​​værdier forbundet med overlappende datointervaller

Her er mit forsøg på at løse dette problem:

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

Den inderste underforespørgsel samler alle grænsedatoer i ét sæt ved hjælp af union , og sorterer dem derefter.
Derefter bygger den ydre underforespørgsel nye intervaller fra tilstødende datoer ved hjælp af lead funktion.
I sidste ende bliver disse nye områder knyttet til kildetabellen i hovedforespørgslen, aggregeret og sum er beregnet.

EDIT
order by klausul i den inderste forespørgsel er redundant og kan springes over, fordi lead(x) over caluse sorterer poster efter datoer, og et resultatsæt fra den inderste underforespørgsel skal ikke sorteres.




  1. Mysql-forespørgsel til gennemsnitstid

  2. (udbyder:Named Pipes Provider, fejl:40 - Kunne ikke åbne en forbindelse til SQL Server)

  3. Sådan ændres bruger til superbruger i PostgreSQL

  4. Kan ikke bruge utf8mb4 tegnsæt med CloudSQL på AppEngine Python