Zde je můj pokus o vyřešení tohoto problému:
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
Ukázka:http://sqlfiddle.com/#!15/ef6cb/13
Nejvnitřnější poddotaz shromažďuje všechna hraniční data do jedné sady pomocí union
, pak je seřadí.
Pak vnější dílčí dotaz vytvoří nové rozsahy ze sousedních dat pomocí lead
funkce.
Nakonec jsou tyto nové rozsahy připojeny ke zdrojové tabulce v hlavním dotazu, agregovány a sum
se počítá.
EDITorder by
klauzule v nejvnitřnějším dotazu je nadbytečná a lze ji přeskočit, protože lead(x) over
caluse seřadí záznamy podle dat a sada výsledků z nejvnitřnějšího poddotazu se nemusí třídit.