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
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| » | 최대공약수, 최소공배수 구하기 | 박상현 | 2006.06.13 | 5566 |
| 105 | 문자열에서 특정 단어 갯수 구하기 | 박상현 | 2006.06.13 | 5154 |
| 104 | 소수(prime number) 구하기 | 박상현 | 2006.06.13 | 4838 |
| 103 | 달력 생성 쿼리 | 박상현 | 2006.06.13 | 4837 |
| 102 | 다중 Row 결과를 단일행으로 컴마로 분리해 출력하는 방법 (2) | 박상현 | 2006.06.13 | 5569 |
| 101 | 다중 Row 결과를 단일행으로 컴마로 분리해 출력하는 방법 (1) | 박상현 | 2006.06.13 | 5389 |
| 100 | 문자열 행으로 분리하기 | 박상현 | 2006.06.13 | 5576 |
| 99 | TABLE,COLUMN,PROCEDURE 이름을 확인할때... | 원우석 | 2006.03.10 | 4705 |
| 98 | NESTED TABLE과 VARRAY사용법과 다른점 | 박상현 | 2005.11.03 | 10410 |
| 97 | crontab 에 오라클 환경변수를 인식시킬때 [1] | 원우석 | 2004.12.06 | 6370 |
| 96 | oracle proc 에서 stdarg.h파일사용하기위한 환경설정 | 원우석 | 2004.12.06 | 14480 |
| 95 | 시스템카탈로그에서 프로시져 정보확인 쿼리 | 원우석 | 2004.07.31 | 4215 |
| 94 | 프로시져생성 문을 실행하는 방법 | 원우석 | 2004.07.31 | 4026 |
| 93 | 시스템카탈로그에서 테이블 정보확인 쿼리 | 원우석 | 2004.07.31 | 5704 |
| 92 | DB2 에러 메시지 확인 | 원우석 | 2004.07.31 | 4282 |
| 91 | 필드 타입케스팅 | 원우석 | 2004.07.31 | 4204 |
| 90 | 암호화(이름과,암호를 암호화할때) | 원우석 | 2004.07.31 | 4096 |
| 89 | 결과를 n개 행만을 취할때 | 원우석 | 2004.07.31 | 3876 |
| 88 | pre컴파일 및 실행계획로그만들기 | 원우석 | 2004.07.31 | 4042 |
| 87 | CLP 명령모음집 | 원우석 | 2004.07.31 | 4836 |