問題:現(xiàn)有一堆的時間段,s表示開始時間,e表示結(jié)束時間。需要將所有時間段合并。
合并規(guī)則:
- 如果2個時間段有重疊則合并成一個時間。
- 不重疊則作為一個單獨的時間段。
with base_tb as (
SELECT named_struct('s', s, 'e', e) span
from (
select *
from values
(1, 3),
(2, 7),
(5, 6),
(4, 11),
(10, 11),
(11, 14)
as (s, e)
) as a
)
--每次一個新元素和最后一個元素比較,看是融合進去還是新增一個
select aggregate(spans, array(spans[0]), (acc, x) ->
if(x.s <= acc[size(acc)-1].e,
--剔除最后一個,做一個新的融合進去
array_union(array_remove(acc, acc[size(acc)-1]),
array(named_struct(
's', acc[size(acc)-1].s,
'e', array_max(array(acc[size(acc)-1].e, x.e))))),
array_union(acc, array(x))
)
)
from (
select array_sort(spans) spans
from (
select collect_list(span) spans
from base_tb
) as a
)