DataBase/Oracle

[ORACLE]지정한 범위에서의 위치를 구하는 WIDTH_BUCKET함수

DevStory 2021. 5. 9.

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

반응형

댓글