본문 바로가기

[오라클 레퍼런스 함수] PERCENTILE_CONT - 보간된 백분위 계산

by ㅇㅍㅍ 2023. 8. 12.
[오라클 레퍼런스 함수] PERCENTILE_CONT - 보간된 백분위 계산
728x90

 

PERCENTILE_CONT

 

구문

PERCENTILE_CONT(expr) WITHIN GROUP
  (ORDER BY expr [ DESC | ASC ])
  [ OVER (query_partition_clause) ]

 

참고:

OVER 절의 구문, 의미, 그리고 제한 사항에 대한 정보는 분석 함수에 대한 내용을 참조하세요.

 

목적

PERCENTILE_CONT는 연속적인 분포 모델을 가정한 역분포 함수입니다. 백분위 값을 가져오고 정렬 명세(sort specification)를 지정한 다음 해당 백분위 값에 따라 정렬 명세와 관련하여 보간된 값(interpolated value)을 반환합니다. 계산 시 NULL 값은 무시됩니다.

이 함수는 숫자 데이터 유형이나 숫자 데이터 유형으로 암묵적으로 변환될 수 있는 비숫자 데이터 유형을 인수로 사용합니다. 함수는 인수의 숫자 데이터 유형과 동일한 데이터 유형을 반환합니다.

 

참고:

암묵적 변환에 대한 자세한 내용은 표 2-8을 참조하십시오.

 

첫 번째 expr은 백분위 값을 나타내는 0과 1 사이의 숫자 값으로 평가되어야 합니다. 이 expr은 각 집계 그룹 내에서 상수여야 합니다. ORDER BY 절은 하나의 표현식을 가져야 하며 숫자나 날짜/시간 값이어야 합니다. 이는 Oracle이 보간을 수행할 수 있는 유형입니다.

PERCENTILE_CONT의 결과는 값들을 정렬한 후에 선형 보간을 통해 계산됩니다. 백분위 값(P)과 집계 그룹 내의 행 수(N)를 사용하여 정렬 명세에 따라 행을 정렬한 후에 관심 있는 행 번호를 계산할 수 있습니다. 이 행 번호(RN)는 다음과 같은 공식에 따라 계산됩니다: RN = (1+(P*(N-1)). 집계 함수의 최종 결과는 행 번호 CRN = CEILING(RN)FRN = FLOOR(RN)에 해당하는 행들의 값 사이에서 선형 보간을 통해 계산됩니다.

최종 결과는 다음과 같을 것입니다:

  If (CRN = FRN = RN) then the result is
    (value of expression from row at RN)
  Otherwise the result is
    (CRN - RN) * (value of expression for row at FRN) +
    (RN - FRN) * (value of expression for row at CRN)

 

PERCENTILE_CONT 함수를 분석 함수로 사용할 수 있습니다. OVER 절에는 query_partitioning_clause만 지정할 수 있습니다. 각 행마다 해당 파티션 내의 값 세트에서 지정된 백분위에 해당하는 값을 반환합니다.

MEDIAN 함수는 백분위 값이 기본적으로 0.5인 PERCENTILE_CONT의 특별한 경우입니다. 자세한 내용은 MEDIAN을 참조하십시오.

 

노트: PERCENTILE_CONT 함수로 대량의 데이터를 처리하기 전에, 정확한 결과보다 빠르게 근사 결과를 얻기 위해 다음 중 하나의 방법을 사용하는 것을 고려해보세요:
• PERCENTILE_CONT 함수를 사용하기 전에 APPROX_FOR_PERCENTILE 초기화 매개변수를 PERCENTILE_CONT 또는 ALL로 설정합니다. 이 매개변수에 대한 자세한 내용은 Oracle Database Reference 문서를 참조하세요.

• PERCENTILE_CONT 함수 대신 APPROX_PERCENTILE 함수를 사용하세요. APPROX_PERCENTILE에 대해서는 참조하세요.

 

집계 예제

다음 예제는 각 부서의 중앙값 급여를 계산합니다:

SELECT department_id,
       PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary DESC) "Median cont",
       PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY salary DESC) "Median disc"
  FROM employees
  GROUP BY department_id
  ORDER BY department_id;

DEPARTMENT_ID Median cont Median disc
------------- ----------- -----------
           10        4400        4400
           20        9500       13000
           30        2850        2900
           40        6500        6500
           50        3100        3100
           60        4800        4800
           70       10000       10000
           80        8900        9000
           90       17000       17000
          100        8000        8200
          110       10154       12008
                     7000        7000

 

PERCENTILE_CONTPERCENTILE_DISC는 서로 다른 결과를 반환할 수 있습니다. PERCENTILE_CONT는 선형 보간을 수행한 후 계산된 결과를 반환합니다. 반면에 PERCENTILE_DISC는 집계된 값 집합 중 하나의 값을 반환합니다. 이 예제에서와 같이 백분위 값이 0.5인 경우, PERCENTILE_CONT는 원소 수가 짝수인 그룹의 경우 두 가운데 값의 평균을 반환하지만, PERCENTILE_DISC는 그 두 가운데 값 중 첫 번째 값을 반환합니다. 원소 수가 홀수인 집계 그룹의 경우, 두 함수 모두 중간 원소 값을 반환합니다.

 

분석 예제

다음 예제에서, 부서 60의 중간값은 4800이며, 해당 백분위수 (Percent_Rank)는 0.5입니다. 그러나 부서 30의 급여 중 어느 것도 백분위수가 0.5가 아니므로 중간값은 2900 (백분위수 0.4)과 2800 (백분위수 0.6) 사이에서 보간되어 2850으로 계산됩니다.

SELECT last_name, salary, department_id,
       PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary DESC) 
         OVER (PARTITION BY department_id) "Percentile_Cont",
       PERCENT_RANK() 
        OVER (PARTITION BY department_id ORDER BY salary DESC) "Percent_Rank"
  FROM employees
  WHERE department_id IN (30, 60)
  ORDER BY last_name, salary, department_id;

LAST_NAME                     SALARY DEPARTMENT_ID Percentile_Cont Percent_Rank
------------------------- ---------- ------------- --------------- ------------
Austin                          4800            60            4800           .5
Baida                           2900            30            2850           .4
Colmenares                      2500            30            2850            1
Ernst                           6000            60            4800          .25
Himuro                          2600            30            2850           .8
Hunold                          9000            60            4800            0
Khoo                            3100            30            2850           .2
Lorentz                         4200            60            4800            1
Pataballa                       4800            60            4800           .5
Raphaely                       11000            30            2850            0
Tobias                          2800            30            2850           .6

 


출처: 오라클 레퍼런스

원문 링크: Oracle PERCENTILE_CONT 함수 문서

 

반응형

댓글