sql >> Database >  >> RDS >> PostgreSQL

bereken de som van waarden die zijn gekoppeld aan overlappende perioden

Hier is mijn poging om dit probleem op te lossen:

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

De binnenste subquery verzamelt alle grensdatums in één set met behulp van union , sorteert ze vervolgens.
Vervolgens bouwt de buitenste subquery nieuwe bereiken van aangrenzende datums met behulp van lead functie.
Uiteindelijk worden deze nieuwe bereiken samengevoegd met de brontabel in de hoofdquery, geaggregeerd en sum wordt berekend.

EDIT
De order by clausule in de binnenste query is overbodig en kan worden overgeslagen, omdat lead(x) over caluse ordent records op datum en een resultatenset van de binnenste subquery hoeft niet te worden gesorteerd.




  1. Een speciaal netwerk configureren voor communicatie met beschikbaarheidsgroepen

  2. Rollende telling van rijen binnen tijdsinterval

  3. PostgreSQL - herstelde database kleiner dan origineel

  4. Hoe deze twee SQL-statements te combineren?