게시일: Dec 12, 2011 11:26:53 PM
- 특정 기준에 의해 데이터들을 분할하는 분석 함수인데, NTILE() 과는 분할하는 기준이 약간 다르다.
[구문 형식]
WIDTH_BUCKET ( expr, min_value, max_value, num_buckets )
min_value : 분할할 구간의 최소값
max_value : 분할할 구간의 최대값
num_buckets : 분할할 개수
select row_value
, WIDTH_BUCKET(row_value, 1, 100, 4) width
, NTILE(4) OVER (ORDER BY row_value) tile
from (
select 10 row_value from dual union all
select 35 row_value from dual union all
select 26 row_value from dual union all
select 55 row_value from dual union all
select 49 row_value from dual union all
select 75 row_value from dual union all
select 9 row_value from dual union all
select 29 row_value from dual union all
select 44 row_value from dual union all
select 99 row_value from dual
)
order by width ;
------------------------
ROW_VALUE WIDTH TILE
------------------------
10 1 1
9 1 1
29 2 2
26 2 1
35 2 2
49 2 3
44 2 2
75 3 4
55 3 3
99 4 4
------------------------
-> NTILE : 컬럼값(9~99) 전체를 대상으로 각각 25%씩 분할하여 값을 반환
-> WIDTH_BUCKET : 주어진 범위(1~100)에 따라 값을 평가한 결과를 반환
-----------------------
범위 값 반환 값
-----------------------
1 ~ 25 1
26 ~ 50 2
51 ~ 75 3
76 ~ 100 4
-----------------------
☞ 범위가 벗어난 값은 어떻게 처리될까?
select row_value
, WIDTH_BUCKET(row_value, 10, 90, 4) width
, NTILE(4) OVER (ORDER BY row_value) tile
from (
select 10 row_value from dual union all
select 35 row_value from dual union all
select 26 row_value from dual union all
select 55 row_value from dual union all
select 49 row_value from dual union all
select 75 row_value from dual union all
select 9 row_value from dual union all
select 29 row_value from dual union all
select 44 row_value from dual union all
select 99 row_value from dual
)
order by width ;
------------------------
ROW_VALUE WIDTH TILE
------------------------
9 0 1 --> 범위값 미만은 0을 반환한다.
10 1 1
26 1 1
29 1 2
35 2 2
49 2 3
44 2 2
55 3 3
75 4 4
99 5 4 --> 범위값을 넘어가는 값은 n+1을 반환한다.
------------------------