Oracle समाधान:
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
आउटपुट अनुरोध के अनुसार है। मेरी अंग्रेजी अच्छी नहीं है, इसलिए इसे समझाना मुश्किल है, लेकिन आइए कोशिश करते हैं:
l
- नंबर जेनरेटर,r
-ranges
. से डेटा गिनती की दूरी के साथ,t1
- प्रत्येक lvl के लिए न्यूनतम दूरी के साथ मान ढूँढता है,t2
- सीमा शुरू होने पर यह बताने वाले मार्कर जोड़ता है,t3
- कॉलम जोड़ता है जिसका उपयोग हम आगे डेटा समूहीकरण के लिए करेंगे।