WIDTH_BUCKET Function
WIDTH_BUCKET (expr, min_value, max_value, num_buckets)
최솟값(min_vale)과 최댓값(max_value) 범위에서 버킷 수(num_buckets)만큼 동일한 데이터 세트를 나눕니다.
표현식(expr)이 속하는 버킷 번호(정숫값)를 리턴합니다.
말이 상당히 어렵기 때문에 아래 예제로 설명합니다.
WIDTH_BUCKET (expr, 0, 100, 4)
0~100 범위를 4개의 구간으로 나누면 아래의 범위로 나누어지게 됩니다.
유의사항
※ 대부분 다른 블로그에서 잘못된 정보를 알려주고 있습니다. 범위는 소수까지 따져야 합니다.
1구간 : 0 ~ 24.999...
2구간 : 25 ~ 49.999...
3구간 : 50 ~ 74.999...
4구간 : 75 ~ 99.999...
expr이 1일 경우 1을 리턴합니다.
expr이 99.999일 경우 4를 리턴합니다.
특징
- 표현식(expr)이 범위에 속하는 최솟값(min_value) 보다 작을 경우 0을 리턴합니다.
▶ 표현식(expr) < 최솟값(min_value)
- 표현식(expr)이 범위에 속하는 최댓값(max_value)과 같거나 클 경우 버킷 수(num_buckets) + 1을 리턴합니다.
▶ 표현식(expr) >= 최댓값(min_value)
- 최댓값(max_value)이 최솟값(min_value)보다 작을 경우 컴파일은 되나 정상적으로 계산이 되지 않습니다.
매개변수
expr
- 표현식은 숫자 또는 날짜, 시간 타입만 가능합니다.
- NULL일 경우 NULL을 반환합니다.
min_value
- 표현식에 대해 허용되는 최솟값입니다.
- 숫자나 날짜 값으로 설정해야 합니다.
- NULL은 최솟값으로 설정이 불가능하며, NULL로 설정 시 에러가 발생합니다.
max_value
- 표현식에 대해 허용되는 최댓값입니다.
- 숫자나 날짜 값으로 설정해야 합니다.
- NULL은 최솟값으로 설정이 불가능하며, NULL로 설정 시 에러가 발생합니다.
num_buckets
- 버킷 수를 설정하는 값입니다.
- 정수(INTEGER)로 설정해야 합니다.
- 실수형으로 설정 시 소숫점은 무시합니다.
- 음수로 설정시 에러가 발생합니다.
EX 1) 숫자
WITH TEST_TABLE AS
(
SELECT -10 AS COL
FROM DUAL UNION
SELECT 0
FROM DUAL UNION
SELECT 24.999
FROM DUAL UNION
SELECT 25
FROM DUAL UNION
SELECT 49.999
FROM DUAL UNION
SELECT 50
FROM DUAL UNION
SELECT 74.999
FROM DUAL UNION
SELECT 75
FROM DUAL UNION
SELECT 99.999
FROM DUAL UNION
SELECT 100
FROM DUAL
)
SELECT COL
, WIDTH_BUCKET(COL, 0, 100, 4) AS WIDTH_BUCKET_COL
FROM TEST_TABLE
-10은 최솟값 0보다 작으므로 0이 리턴되었습니다.
100은 최댓값과 동일하므로 버킷 수 + 1인 5가 리턴되었습니다.
EX 2) 날짜
WITH TEST_TABLE AS
(
SELECT TO_DATE('20201231', 'YYYYMMDD') AS COL
FROM DUAL UNION
SELECT TO_DATE('20210101', 'YYYYMMDD')
FROM DUAL UNION
SELECT TO_DATE('20210331', 'YYYYMMDD')
FROM DUAL UNION
SELECT TO_DATE('20210401', 'YYYYMMDD')
FROM DUAL UNION
SELECT TO_DATE('20210630', 'YYYYMMDD')
FROM DUAL UNION
SELECT TO_DATE('20210701', 'YYYYMMDD')
FROM DUAL UNION
SELECT TO_DATE('20210930', 'YYYYMMDD')
FROM DUAL UNION
SELECT TO_DATE('20211001', 'YYYYMMDD')
FROM DUAL UNION
SELECT TO_DATE('20211231', 'YYYYMMDD')
FROM DUAL UNION
SELECT TO_DATE('20220101', 'YYYYMMDD')
FROM DUAL
)
SELECT COL
, WIDTH_BUCKET(COL, TO_DATE('20210101', 'YYYYMMDD'), TO_DATE('20211231', 'YYYYMMDD'), 4) AS WIDTH_BUCKET_COL
FROM TEST_TABLE
'DataBase > Oracle' 카테고리의 다른 글
[ORACLE]반올림하는 ROUND 함수 (0) | 2021.05.16 |
---|---|
[ORACLE]소수점, 날짜 자르는 TRUNC 함수 (0) | 2021.05.16 |
[ORACLE]올림 처리하는 CEIL 함수 (0) | 2021.05.09 |
[ORACLE]문자열 합치기 (CONCAT, ||) (0) | 2021.05.08 |
[ORACLE]문자열 첫번째 문자, 마지막 문자 자르기 (SUBSTR, INSTR) (0) | 2021.05.07 |
댓글