SQL Challenge/Puzzle: How to merge nested ranges?

后端 未结 3 1768
醉酒成梦
醉酒成梦 2021-01-06 03:40
  • This challenge is based on a real life use-case involving IP ranges.
  • The solution I came with is based on the stack trace challenge I\'ve presented previously
3条回答
  •  心在旅途
    2021-01-06 04:25

    Oracle solution:

    with l as ( select level lvl from dual connect by level < 66 ),
         r as ( select range_start r1, range_end r2, range_val v, 
                        range_end - range_start + 1 cnt 
                  from ranges ),
         t1 as (select distinct lvl, 
                       nvl(max(v) keep (dense_rank first order by cnt) 
                                  over (partition by lvl), '*' ) m
                  from l left join r on lvl between r1 and r2 ),
         t2 as (select lvl, m, case when lag(m) over (order by lvl) <> m then 0 else 1 end mrk 
                  from t1),
         t3 as (select lvl, m, lvl - sum(mrk) over (order by lvl) grp from t2)
    select min(lvl) r1, max(lvl) r2, nullif(min(m), '*') val
      from t3 group by grp order by r1
    

    Output is as requested. My English is far from good, so it's hard to explain, but let's try:

    • l - number generator,
    • r - data from ranges with counted distance,
    • t1 - finds value with minimal distance for each lvl,
    • t2 - adds markers telling if range starts,
    • t3 - adds column which we will next use for grouping data.

提交回复
热议问题