PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Berechnen Sie die Summe der Werte, die sich überschneidenden Datumsbereichen zugeordnet sind

Hier ist mein Versuch, dieses Problem zu lösen:

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

Die innerste Unterabfrage sammelt alle Grenzdaten mithilfe von union in einem Satz , und sortiert sie dann.
Dann erstellt die äußere Unterabfrage neue Bereiche aus benachbarten Datumsangaben unter Verwendung von lead Funktion.
Am Ende werden diese neuen Bereiche mit der Quelltabelle in der Hauptabfrage verknüpft, aggregiert und sum berechnet.

BEARBEITEN
Die order by -Klausel in der innersten Abfrage ist redundant und kann übersprungen werden, da lead(x) over caluse ordnet Datensätze nach Datum, und eine Ergebnismenge aus der innersten Unterabfrage muss nicht sortiert werden.