Inilah upaya saya untuk memecahkan masalah ini:
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
Subquery terdalam mengumpulkan semua tanggal batas menjadi satu set menggunakan union
, lalu mengurutkannya.
Kemudian subkueri luar membuat rentang baru dari tanggal yang berdekatan menggunakan lead
fungsi.
Pada akhirnya, rentang baru ini digabungkan ke tabel sumber dalam kueri utama, agregat, dan sum
dihitung.
EDITorder by
klausa dalam kueri terdalam adalah berlebihan dan dapat dilewati, karena lead(x) over
caluse memesan catatan berdasarkan tanggal, dan kumpulan hasil dari subkueri terdalam tidak harus diurutkan.