1
11
12
1121
122111
112213
12221131
1123123111
12213111213113
다음엔 어떤 숫자가 올까요?
일전(2008년1월)에 퀴즈게시판에 올라왔던 문제였죠.
http://www.gurubee.net/article/15844
이 문제는 베르나르베르베르의 소설 [개미]에서 소개된 수열로
일명 [개미수열]이라고 합니다.
당시 제가 이걸 프로시져로 구현한 적이 있었는데요.
http://www.gurubee.net/article/15916
문득 SQL 로는 구현할수 없을까? 라는 고민을 하게 되었습니다.
퀴즈입니다.
개미수열을 출력하는 SQL 을 작성하시오.
[정답] <=== 트리플 클릭
WITH t(n, v, x) AS
(
SELECT 1 n
, CAST('1' AS VARCHAR2(100)) v
, CAST('' AS VARCHAR2(100)) x
FROM dual
UNION ALL
SELECT NVL2(x, n, n+1) n
, NVL2(x, v||SUBSTR(x, 1, 1)||LENGTH(REGEXP_SUBSTR(x, '^(.)(\1)*'))
, SUBSTR(v, 1, 1)||LENGTH(REGEXP_SUBSTR(v, '^(.)(\1)*'))
) v
, REGEXP_REPLACE(NVL(x, v), '^(.)(\1)*') x
FROM t
WHERE NVL2(x, n, n+1) <= 10
)
SELECT n, v
FROM t
WHERE x IS NULL
;
with t(rn, col) as
(
select 1 as rn, '1' as col from dual union all
Select rn+1 as rn
, ( select listagg(max(substr(col,rnum,1))||count(*) within group(order by min(rnum)
From dual
, (select level as rnum from dual connect by level <= 10000)
Where rnum <= length(col)
Group by regexp_instr(col, '[^'||substr(col,rnum,1)||']',rnum)
)
From t
Where rn <10
)
Select * from t