sql >> Databasteknik >  >> RDS >> PostgreSQL

beräkna summan av värden associerade med överlappande datumintervall

Här är mitt försök att lösa det här problemet:

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 innersta underfrågan samlar alla gränsdatum i en uppsättning med union , sedan sorterar dem.
Då bygger den yttre underfrågan nya intervall från angränsande datum med lead funktion.
I slutändan kopplas dessa nya intervall till källtabellen i huvudfrågan, aggregerade och sum beräknas.

EDIT
order by satsen i den innersta frågan är redundant och kan hoppas över, eftersom lead(x) over caluse ordnar poster efter datum, och en resultatuppsättning från den innersta underfrågan behöver inte sorteras.




  1. Hur man uppdaterar MySQL med PHP och AJAX utan att UPPDATERA SIDAN

  2. hur man skriver nummer till ord-funktion i sql-server

  3. pl/sql lagrad procedur:parameternamn samma som kolumnnamn

  4. Hur man använder grejfunktionen i Oracle