Skip Headers

오라클 10g 함수
10g Release 1 (10.1)
Go to Documentation Home
HOME
Go to Book List
ORA_home
Go to Table of Contents
연구회
Go to Index
자료실
Go to Master Index
ORA_10G
Go to Feedback page
MAIL

Go to previous page
Previous
Go to next page
Next

NTILE

문법

MAIN

ntile::=
Description of ntile.gif follows

그림 설명


참 조 :

"Analytic Functions " for information on syntax, semantics, and restrictions, including valid forms of expr

목적

MAIN

NTILE함수는 분석 함수 이다. 순서화된 데이터를 expr에 의해 지정된 bucket의 수로 분할하여, 각 행을 적절한 bucket 번호를 할당한다. buckets은 1~expr의 번호를 붙일수 있다. expr의 값은 각 파티션에 대하여 양의 정수로 변활될 필요가 있다. 오라클 데이터 베이스는 정수로 간주하기 위해, 만약 expr이 정수가 아닌 상수라면, 오라클은 정수로 값을 절삭한다. 반환되는 값은 NUMBER이다.

Bucket에서 행의 수는 대부분 1과 다를수 있다. 나머지 값(bucket에 의해 나누어진 행 수의 나머지)은 bucket 1로 시작하여서, 각 bucket에 하나씩 분할된다.

만약 expr이 행의 수보다 큰 경우에는, buckets의 수는 행의 수와 동일한 채워지고, 나머지는 bucket은 비운다.

expr에 NTILE 또는 다른 분석 함수를 이용할수 없다. 분석함수는 중첩 될수 없고, expr에는 다른 built-in 함수 표현은 사용할수 있다.

NTILE()함수는 정렬된 PARTITION을BUCKET이라 불리는 그룹별로 나누고 PARTITION내의 각 ROW등을 BUCKET에 배치하는 함수로 각 BECKET에는 동일한 수의 ROW가 배치된다. 예를 들어 PARTITION내에 100개의 ROW를 가지고 있고 4개의 BUCKET으로 나누는 NTILE(4)를 사용하면 1개의 BUCKET당 25개의 ROW가 배정된다. 만일 각 PARTION의 수가 정확하게 분배되지 않을 경우 근사치로 배분한 후 남는 값에 대하여 최초 PARTITION부터 한 개씩 배분한다. 즉, 만일 103개의 ROW에 대하여 NTILE(5)를 적용하면 첫번째 BUCKET부터 세번째까지는 21개의 ROW가, 나머지는 20개의 ROW가 배치된다.

[그림]는 "제품별 판매량을 구하고, 이를 4등급으로 나누어, 다시 등급 내에서 순위를 매겨라"는 질의를 NTILE()함수를 이용하여 구현한 것이다.

SELECT  p_productkey, sum(s_amount) AS sum_s_amount, 
    NTILE(4) over (ORDER BY sum(s_amount) DESC) as 4_tile,
    RANK() OVER (PARTITION BY NTILE(4) over 
    (ORDER BY sum(s_amount) DESC) ORDER BY sum_s_amount DESC) 
    AS rank_in_quartile
FROM product, sales
WHERE p_productkey = s_productkey
GROUP BY p_productkey);


[그림] NTILE() 활용

 

예제

MAIN

다음 예제는 부서 100으로 부터 oe.employees 테이블의 급여 열에서 값을 4개의 buckets으로 분할한다. 이 부문에서 급여 칼럼은 6개 값이 존재하기 때문에, 2개 여분의 값은 (6/4의 나머지) buckets의 1과 2에 할당된다. 그러므로 bucket 1과 2는 3과 4보다 하나더 할당된다.

SELECT last_name, salary, NTILE(4) OVER (ORDER BY salary DESC) 
   AS quartile FROM employees
   WHERE department_id = 100;

LAST_NAME                     SALARY   QUARTILE
------------------------- ---------- ----------
Greenberg                      12000          1
Faviet                          9000          1
Chen                            8200          2
Urman                           7800          2
Sciarra                         7700          3
Popp                            6900          4