SQL中時間段合并

問題:現(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
)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容