SQL 캠프 패키지 광고 이미지
  • SQL

PERCENTILE_CONT 함수를 이용해 중앙값 계산하기 [PostgreSQL]

SQL 캠프 패키지 광고 이미지
SQL 캠프 패키지 광고 이미지
DBMS와 관계 없이 중앙값을 계산하는 방법은 이전 글을 참고해주세요.
 
PostgreSQL에서는 PERCENTILE_CONT 함수를 이용해 중앙값을 계산할 수 있습니다. 먼저, PERCENTILE_CONT 함수 그리고 비슷하게 생긴 PERCENTILE_DISC 함수가 어떤 기능을 하는지 살펴보겠습니다.
 

관련 함수 알아보기

  • PERCENTILE_DISC: 입력한 백분율에 위치한 값을 찾되, 정확히 일치하는 값이 없는 경우 선순위 데이터를 출력 (실제 데이터에 있는 값만 출력)
  • PERCENTILE_CONT: 입력한 백분율에 위치한 값을 찾되, 정확히 일치하는 값이 없는 경우 선형 보간(Linear Interpolation)하여 값을 계산 (실제 데이터에는 없는 값을 출력할 수 있음)
 

PERCENTILE_DISC

데이터가 홀수개인 경우부터 살펴보겠습니다.
measured_at
pm10
2022-01-03
28
2022-01-01
31
2022-01-04
37
2022-01-02
39
2022-01-05
52
 
위 같이 데이터가 홀수개일 때 PERCENTILE_DISC에 0.5 위치에 있는 데이터를 찾아달라고 하면, 중앙에 있는 값 37을 출력합니다. 우리가 아는 중앙값의 정의와 동일합니다.
 
 
💡
SQL 캠프 마스터반 수강생이라면 solvesql의 플레이그라운드에서 PostgreSQL 코드를 실행해 볼 수 있어요. 데이터베이스로 ‘서울숲 일별 평균 대기오염도’를 선택하고 데이터를 확인해 보세요.
 
데이터가 짝수개인 경우에는 어떨까요?
measured_at
pm10
2022-01-03
28
2022-01-01
31
2022-01-04
37
2022-01-02
39
2022-01-05
52
2022-01-06
56
 
위와 같이 데이터가 짝수개인 경우에는, 최대한 중앙에 가까운 값 중에 선순위 데이터를 출력합니다. 예를 들어 위의 데이터에서는 중앙에 있는 37, 39가 중앙에 있는 값이고, 이 중에 ORDER BY pm10 이라는 조건 아래 선순위 데이터는 37입니다.
 
 
이 경우에는 데이터가 홀수개일 때와는 다르게 중앙값의 정의와는 차이가 있습니다. 데이터가 짝수개일때 중앙값은 중앙에 있는 값 두 개의 평균입니다. 따라서 중앙값의 정의대로 계산하면 38이 출력되어야 합니다.
 
 

PERCENTILE_CONT

PERCENTILE_CONT는 데이터가 홀수개인 경우는 PERCENTILE_DISC과 차이가 없지만, 데이터가 짝수개인 경우에는 약간의 차이가 있습니다. 데이터가 짝수개인 경우, PERCENTILE_CONT는 중앙에 있는 두 개의 값을 선형 보간(Linear Interpolation)합니다.
 
measured_at
pm10
2022-01-03
28
2022-01-01
31
2022-01-04
37
2022-01-02
39
2022-01-05
52
2022-01-06
56
 
따라서, 아래 코드를 실행하면 37과 39의 평균인 38이 결과로 출력됩니다.
 
 
이는 중앙값의 정의와 일치하는 결과로, 중앙값을 계산하기 위해서는 PERCENTILE_CONT 함수를 사용해야 함을 알 수 있습니다. PERCENTILE_CONTPERCENTILE_DISC의 차이점을 중심으로 기억하면 헷갈리지 않고 사용할 수 있습니다.
 
 
 

중앙값 계산하기

정리해보면, PostgreSQL에서 중앙값을 계산할 때에는 PERCENTILE_CONT 함수를 아래와 같이 사용합니다.
 
 
아래와 같이 GROUP BY 문과 함께 사용하여 그룹별 중앙값을 계산할 수도 있습니다.
 
 
중앙값을 계산하는 방법은 다양하지만, 직접 구현하는 것 보다는 DBMS에서 최적화가 되어있는 내장 함수를 적극 이용하는 것이 성능면에서 유리합니다. 물론 코드의 가독성도 높아집니다. 적당한 내장 함수가 없는 DBMS에서는 이전 글에서 보여드린 것과 같이 직접 구현하는 것이 필요합니다.
 
 
 

연습 문제

미세먼지 수치의 계절간 차이 문제를 풀고 배운 내용을 복습해보세요! Advent of SQL에서 더 많은 SQL 문제를 풀어볼 수 있습니다.
윤선미데이터 분석가

쿠팡, 하이퍼커넥트, 카카오에서 데이터 분석가로 일했습니다. 지금은 데이터리안에서 강의, 데이터 분석, 경영 지원 일을 하고 있습니다. 창업을 하고, 데이터 분석가 출신 멤버들과 함께 일하면서 데이터의 힘을 더 믿게 되었습니다.

함께 읽어보면 좋은 글