-- 예시자료와 결과자료가 일치하지 않네요..임의로 조정해서 해봤습니다. WITH t AS ( SELECT LEVEL lv FROM dual WHERE LEVEL NOT IN (7, 9, 15, 22, 23, 24, 25, 33, 36) CONNECT BY LEVEL <= 40 ) SELECT MIN(DECODE(MOD(rn, 4), 1, v)) v1 , MIN(DECODE(MOD(rn, 4), 2, v)) v2 , MIN(DECODE(MOD(rn, 4), 3, v)) v3 , MIN(DECODE(MOD(rn, 4), 0, v)) v4 FROM (SELECT ROW_NUMBER() OVER(ORDER BY MIN(lv)) rn , MIN(lv) || DECODE(COUNT(*), 1, '', '~'||MAX(lv)) v FROM (SELECT lv , ROWNUM rn , COUNT(*) OVER(PARTITION BY ROWNUM - lv) cnt FROM (SELECT lv FROM t ORDER BY lv) ) GROUP BY lv - rn , CASE WHEN cnt < 5 THEN lv END ) GROUP BY CEIL(rn / 4) ORDER BY CEIL(rn / 4) ; ---------------------------- V1 V2 V3 V4 ---------------------------- 1~6 8 10~14 16~21 26~32 34 35 37 38 39 40 ----------------------------
with t as ( select distinct ceil(level+dbms_random.value(1, 5)) no from dual connect by level <= 30 ) select wm_concat(val) keep(dense_rank first partition by ceil(rownum/4)) val from ( select min(no) no , decode(sign(min(no)-max(no)), 0, to_char(min(no)), min(no)||'~'||max(no)) val from (select no , no - row_number() over(order by no) val from t) group by val order by no ) group by ceil(rownum/4) order by ceil(rownum/4);