PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

oblicz sumę wartości powiązanych z nakładającymi się zakresami dat

Oto moja próba rozwiązania tego problemu:

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

Najbardziej wewnętrzne podzapytanie zbiera wszystkie daty graniczne w jeden zestaw za pomocą union , a następnie je sortuje.
Następnie zewnętrzne podzapytanie tworzy nowe zakresy na podstawie sąsiednich dat przy użyciu lead funkcji.
Na koniec te nowe zakresy są łączone z tabelą źródłową w głównym zapytaniu, agregowane i sum jest obliczana.

EDYTUJ
order by klauzula w najbardziej wewnętrznym zapytaniu jest zbędna i można ją pominąć, ponieważ lead(x) over Uwzględnij rekordy zamówień według dat, a zestaw wyników z najbardziej wewnętrznego podzapytania nie musi być sortowany.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Formatuj liczby za pomocą przecinków w PostgreSQL

  2. pobieranie daty ze znacznika czasu w PostgreSQL

  3. Adapter Postgresql (pg):nie można połączyć się z serwerem

  4. Postgresql - nie można usunąć bazy danych z powodu niektórych automatycznych połączeń z DB

  5. zły rekord MAC Błąd SSL między Javą a PortgreSQL