MEDIAN

Syntax

MEDIAN
(
  expression  IN { smallint, int, bigint,
                    real, double precision,
                    timestamp, timestamptz, time, timetz, date }
)
RETURNS median;

개요

MEDIAN 집계 함수는 그룹 내의 값들 중 중앙값(median)을 계산하여 반환하는 통계 함수이다.

Oracle의 MEDIAN 함수를 참고하여 PostgreSQL에서 구현했다.

정수형, 실수형, 날짜/시간 타입 데이터 타입에 대해 사용 가능하다.

내부적으로, MEDIAN 함수는 두 단계로 동작한다.

집계 단계:

  • 그룹 내의 값들을 타입에 맞는 벡터(리스트 자료구조)에 수집하는 단계이다.

  • NULL 값은 집계에서 무시된다.

최종 계산 단계:

  • 그룹 내 모든 값들 수집 완료 시 최종적으로 중앙 값을 산출하는 단계이다.

  • 먼저, 집계된 벡터 내의 값들을 퀵 정렬 알고리즘으로 정렬한다.

  • 집계된 값의 개수가 홀수인 경우 중앙 값을 반환한다.

  • 집계된 값의 개수가 짝수인 경우 중앙의 두 값의 평균을 계산하여 반환한다.

    • 타임존이 있는 날짜 및 시간 관련 데이터의 경우, 중앙의 두 값을 UTC로 타임존 변경 후 평균값 계산한다.

    • UTC 기준으로 평균 값 계산 후 중앙 두 값 중 큰 값의 타임존을 채택한다.

파라미터

파라미터
설명

expression

집계할 값으로, 아래와 같은 데이터 타입을 지원한다. * 정수형: smallint, int, bigint

  • 실수형: real(float4), double precision

  • 날짜/시간형: timestamp, timestamptz, time, timetz, date집계 시 NULL 값은 무시되며, 각 타입에 맞는 내부 벡터에 값들이 저장된다.

주의사항

  • 짝수 개의 값이 집계된 경우, 중앙의 두 값의 평균이 계산되어 반환한다.

  • 내부적으로 C 코드에서 qsort 함수를 사용하여 값들을 정렬한다.

  • 날짜 및 시간 관련 데이터의 경우, Oracle 방식의 처리 로직에 따라 추가적인 타임존 및 형 변환 처리 진행한다.

예제

# 테스트 테이블
create table employees (name varchar, salary integer, hire_date timestamptz);
INSERT INTO employees (name, salary, hire_date) VALUES
('John Doe', 55000, '2020-03-15 09:00:00'),
('Jane Smith', 62000, '2019-07-22 10:30:00'),
('Michael Johnson', 72000, '2018-11-10 08:45:00'),
('Emily Davis', 48000, '2021-05-01 12:00:00'),
('David Wilson', 53000, '2017-09-17 14:20:00'),
('Sarah Brown', 60000, '2016-12-05 09:15:00'),
('James Taylor', 75000, '2015-06-30 16:45:00'),
('Jessica Martinez', 68000, '2022-01-25 11:10:00'),
('Daniel Anderson', 58000, '2020-10-05 13:35:00'),
('Laura Thomas', 49500, '2023-08-12 08:00:00');


-- 정수형 데이터의 중앙값 계산 예제
SELECT oracle.MEDIAN(salary) FROM employees;

 median 
--------
  59000
(1 row)


-- 날짜형 데이터의 중앙값 계산 예제
SELECT oracle.MEDIAN(hire_date) FROM employees;

         median         
------------------------
 2019-11-17 21:45:00+09

Last updated