この問題を解決するための私の試みは次のとおりです。
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
デモ: http://sqlfiddle.com/#!15/ef6cb/13
最も内側のサブクエリは、union
を使用して、すべての境界日付を1つのセットに収集します。 、次にそれらを並べ替えます。
次に、外側のサブクエリは、lead
を使用して、隣接する日付から新しい範囲を作成します。 関数。
最後に、これらの新しい範囲は、メインクエリでソーステーブルに結合され、集計され、sum
計算されます。
編集order by
lead(x) over
であるため、最も内側のクエリの句は冗長であり、スキップできます。 caluseはレコードを日付で並べ替え、最も内側のサブクエリの結果セットを並べ替える必要はありません。