http://www.soqool.com/servlet/board?cmd=view&cat=100&subcat=1010&seq=78&page=1&position=1글쓴이 : 김홍선
테이블 t 가 아래와 같이 주어질때,
row로 주어진 수들의 최대공약수(gcd, greatest common divisor)와 최소공배수(lcm, least common multiple)를 구해보자.
row의 수를 변화시키면서 속도를 고려하여 쿼리를 만들어 보자.
WITH t AS
(SELECT 15 num
FROM DUAL
UNION
SELECT 9
FROM DUAL
UNION
SELECT 42
FROM DUAL)
-- 최대공약수
SELECT level# gcd
FROM (SELECT min_num / LEVEL level#
FROM (SELECT MIN (num) min_num
FROM t)
WHERE TRUNC (min_num / LEVEL) = min_num / LEVEL
CONNECT BY LEVEL <= min_num)
WHERE EXISTS (SELECT 1
FROM t
HAVING SUM (num / level#) = SUM (TRUNC (num / level#)))
AND ROWNUM = 1
-- 최소공배수
SELECT level# lcm
FROM (SELECT max_num * LEVEL level#
FROM (SELECT MAX (num) max_num, EXP (SUM (LN (num))) prod
FROM t)
CONNECT BY LEVEL <= prod)
WHERE EXISTS (SELECT 1
FROM t
HAVING SUM (level# / num) = SUM (TRUNC (level# / num)))
AND ROWNUM = 1
테이블 t 가 아래와 같이 주어질때,
row로 주어진 수들의 최대공약수(gcd, greatest common divisor)와 최소공배수(lcm, least common multiple)를 구해보자.
row의 수를 변화시키면서 속도를 고려하여 쿼리를 만들어 보자.
WITH t AS
(SELECT 15 num
FROM DUAL
UNION
SELECT 9
FROM DUAL
UNION
SELECT 42
FROM DUAL)
-- 최대공약수
SELECT level# gcd
FROM (SELECT min_num / LEVEL level#
FROM (SELECT MIN (num) min_num
FROM t)
WHERE TRUNC (min_num / LEVEL) = min_num / LEVEL
CONNECT BY LEVEL <= min_num)
WHERE EXISTS (SELECT 1
FROM t
HAVING SUM (num / level#) = SUM (TRUNC (num / level#)))
AND ROWNUM = 1
-- 최소공배수
SELECT level# lcm
FROM (SELECT max_num * LEVEL level#
FROM (SELECT MAX (num) max_num, EXP (SUM (LN (num))) prod
FROM t)
CONNECT BY LEVEL <= prod)
WHERE EXISTS (SELECT 1
FROM t
HAVING SUM (level# / num) = SUM (TRUNC (level# / num)))
AND ROWNUM = 1
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 126 | 부등호 조인 | 운영자 | 2002.09.18 | 58315 |
| 125 | REPORT 양식 맞추기 | 운영자 | 2002.09.18 | 32733 |
| 124 | PARAMETER값에 따라 변경이 일어나는 문장 | 운영자 | 2002.09.17 | 17211 |
| 123 | oracle proc 에서 stdarg.h파일사용하기위한 환경설정 | 원우석 | 2004.12.06 | 14480 |
| 122 | oracle의 procedure에서의 여러 리턴값의 활용 예 | 운영자 | 2002.10.18 | 10792 |
| 121 | NESTED TABLE과 VARRAY사용법과 다른점 | 박상현 | 2005.11.03 | 10410 |
| 120 | 테이블 열항목을 행항목으로 변경하는 팁 | 구퍼 | 2011.01.11 | 10276 |
| 119 | 바로이전 ROW의 값을 참조하고자 할때 | 운영자 | 2002.09.18 | 10226 |
| 118 | 오라클 DB 링크 만들기 | 구퍼 | 2011.01.06 | 8152 |
| 117 | toad에서 사용가능한 explan_table생성 script | 박상현 | 2004.05.08 | 8050 |
| 116 | java에서 array처리 방법 | 운영자 | 2003.01.27 | 7933 |
| 115 | COLUMN을 ROW로 | 운영자 | 2002.09.18 | 7665 |
| 114 | mssql update예제(select ~ update) | 구퍼 | 2008.10.31 | 7558 |
| 113 | Instant Client 사용법 | 구퍼 | 2009.12.30 | 7481 |
| 112 | 그룹 단위별 일련번호 붙이기 | 운영자 | 2002.09.18 | 7337 |
| 111 | Conditions | 구퍼 | 2008.09.17 | 7272 |
| 110 | select -> update 구문 샘플 | 구퍼 | 2010.01.21 | 7246 |
| 109 | 데이타에 한글로 공백이 있는 경우 값을 가져오지 못하고 오류가 발생하는 경우 처리 | 구퍼 | 2009.03.23 | 7078 |
| 108 | 현재의 년월일시분초 구하기 | 구퍼 | 2008.09.10 | 6849 |
| 107 | 누계 COLUMN이 없는 TABLE에 누계 값을 보자 (부등호 JOIN) | 운영자 | 2002.09.18 | 6805 |