quarta-feira, 24 de agosto de 2011

Função "aggregate" para cálcular mediana no PostgreSQL

O Postgres não tem uma função que calcule a mediana dos valores de um determinada coluna, ou seja, fazer algo do tipo:

SELECT median(col) FROM tabela;

Mas em http://wiki.postgresql.org/wiki/Aggregate_Median está o código necessário para isso. É pequeno e não precisa entender nada dele pra utilizar. Basta copiar e executar no seu console dentro do banco de dados onde você quer que a função funcione. Se essa função tiver que funcionar em diversos bancos, é preciso executar esse código em cada um deles.

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='{}'
);

Nenhum comentário:

Postar um comentário