2011. 4. 12. 13:47
Postgresql 중앙값 Work/PostgreSQL2011. 4. 12. 13:47
중앙값(median)은 어떤 주어진 값들을 정렬했을 때 가장 중앙에 위치하는 값을 의미한다. 예를 들어 1, 2, 100의 세 값이 있을 때, 2가 가장 중앙에 있기 때문에 2가 중앙값이다.
값이 짝수개일 때에는 중앙값이 유일하지 않고 두 개가 될 수도 있다. 이 경우 그 두 값의 평균을 취한다. 예를 들어 1, 10, 90, 200 네 수의 중앙값은 10과 90의 평균인 50이 된다.
Postgresql에서 중앙값 구현은 사용자 함수로 생성해서 사용한다.
-------- 사용자 함수 생성 --------
CREATE OR REPLACE FUNCTION _final_median(numeric[])
값이 짝수개일 때에는 중앙값이 유일하지 않고 두 개가 될 수도 있다. 이 경우 그 두 값의 평균을 취한다. 예를 들어 1, 10, 90, 200 네 수의 중앙값은 10과 90의 평균인 50이 된다.
Postgresql에서 중앙값 구현은 사용자 함수로 생성해서 사용한다.
-------- 사용자 함수 생성 --------
CREATE OR REPLACE FUNCTION _final_median(numeric[])
RETURNS numeric AS
$$
SELECT AVG(val)
FROM (
SELECT val
FROM unnest($1) val
ORDER BY 1
LIMIT 2 - MOD(array_upper($1, 1), 2)
OFFSET CEIL(array_upper($1, 1) / 2.0) - 1
) sub;
$$
LANGUAGE 'sql' IMMUTABLE;
CREATE AGGREGATE median(numeric) (
SFUNC=array_append,
STYPE=numeric[],
FINALFUNC=_final_median,
INITCOND='{}'
);
-------- 사용예 --------
SELECT median(AA)
FROM (
SELECT 1 AA UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6 UNION ALL
SELECT 7
) A
-- Result : 4.0000000000000000
SELECT median(AA)
FROM (
SELECT 1 AA UNION ALL
--SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6 UNION ALL
SELECT 7
) A
-- Result : 4.5000000000000000