[퀴즈] connect by level 건수 관련 1 12 5,454

by 손님 connect by level [2010.05.31 15:27:54]


아래와 같은 두 경우의 쿼리가 주어졌을 때,
select 결과 건 수가 몇 건인가를 실행 전에 예측하는 문제입니다.

사실, 일반적으로 with문 안에 N개의 건과 임의의 숫자들(ilv 값)이 주어졌을 때,
결과 건 수를 실행 전에 예측할 수 있을까요?
공식이 따로 있을까요?
찾아보시기 바랍니다.


with t as (
select 10 ilv from dual union all
select 100 ilv from dual)
select level olv, ilv
from t
connect by level<=ilv


with t as (
select 4 ilv from dual union all
select 7 ilv from dual union all
select 8 ilv from dual union all
select 11 ilv from dual union all
select 13 ilv from dual)
select level olv, ilv
from t
connect by level<=ilv
by 거짓말신동 [2010.06.01 08:48:59]
SELECT POWER(N, ILV) FROM DUAL

by v상이v [2010.06.01 14:11:02]
with tmp as (
select 10 ilv from dual union all
select 100 ilv from dual
)
SELECT SUM(row_cnt)
FROM (SELECT a.ilv
,ROUND(EXP(SUM(LN( NVL(MAX(b.row_cnt),(SELECT COUNT(*) FROM tmp WHERE ilv >= a.ilv)) )) OVER(ORDER BY a.ilv))) row_cnt
FROM (SELECT LEVEL ilv
FROM dual
CONNECT BY LEVEL <= (SELECT MAX(ilv) FROM tmp)) a,
(SELECT ilv
,COUNT(ilv) OVER(ORDER BY ilv DESC) AS row_cnt
,COUNT(ilv) OVER() AS all_cnt
FROM tmp) b
WHERE a.ilv = b.ilv(+)
GROUP BY a.ilv
)

하고나니 지저분 하네요...
더 쉽게 하는 법이 있을꺼 같은데...ㅡㅅㅜ

by 손님 [2010.06.01 14:16:40]
이 문제에 대한 해답은 쿼리를 만드는 것이 아니라,
위의 쿼리들을, 실행하기 전에 결과 건수를 예측할 수 있는 방법 혹은 수식이 존재하는가를 찾는 것입니다.

by v상이v [2010.06.01 14:51:29]
수학기호들이 생각이 안나요...
공식은 풀어쓰라면 쓰겠는데..
적합한 기호(?) 랄까... -ㅅ-;;;; 그런게 생각이 안나서...ㄷㄷ

by 손님 [2010.06.01 15:21:40]
공식을 풀어 써 보시죠.

by v상이v [2010.06.01 16:13:54]
ilv가 3,4,5 3값을 가지고 있다면
값의 최소값(공통값) => n = 3
값의 개수 => x = 3 개
4 >= 값 의 개수 => y = 2개(4,5)
5 >= 값 의 개수 => z = 1개

ilv <= 3 // 최소값(즉, 3)까진 개수의 n승으로 구한값을 더한다.
x¹ + x² + x³ .... xⁿ

ilv = 4
xⁿ * y // xⁿ 값에 y값을 곱한다.

ilv = 5
(xⁿ * y) * z // xⁿ 값에 y값을 곱한다.



조잡하긴 하지만.........

by 손님 [2010.06.01 16:26:48]
음... 그렇다면, 위의 두 경우에 각각 결과 건수가 몇 건이 나오나요?
풀어쓰자면...

by v상이v [2010.06.01 17:28:39]
10 과 100 으로만 말씀드리면

10 까지는 공통범위니까 2 n승으로

1 : 2¹
2 : 2²
3 : 2³
.....
10 : 2ⁿ <-- n은 10

11부터는 1경우만 해당하므로 계속 * 1

11 : 1024 * 1
12 : 1024 * 1
13 : 1024 * 1
.....
100 : 1024 * 1

해서 나온 모든 값의 합은
94206 입니다.

by 손님 [2010.06.01 17:46:22]
2개만 더 해보죠.

위 문제처럼 4,7,8,11,13 이 있을 경우,
그리고 v상이v님이 예를 드신것처럼 중복건이 있을 경우, 즉 3,4,5,3 이 있을 경우의
건수는요?

by v상이v [2010.06.01 18:07:34]
번째 리플단 쿼리에서 SUM만 빼고 돌려보시겠어요?
같은 질문을 계속 하는 이유를 모르겠어서요..
3,4,5,3 의 경우엔 위에 리플단것중에 풀이 써 놓은거에 대입만 시키시면 나올텐데요...

by 손님 [2010.06.11 09:03:57]
왠지 이 문제는 문제를 냈다기 보단 과제를 하고 있다는 느낌이 드네요

by 손님 [2010.06.11 14:49:19]
과제는 아니구요.
이런 문제를 과제로 낼 곳도 상황도 없을 겁니다.

어쨌거나 v상이v님이 정확히 알고 계시네요.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입