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.
EDYTUJorder 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.