BEGIN; -- median -- http://wiki.postgresql.org/wiki/Aggregate_Median CREATE OR REPLACE FUNCTION median(anyarray) RETURNS float8 AS $$ WITH q AS ( SELECT val FROM unnest($1) val WHERE val IS NOT NULL ORDER BY 1 ), cnt AS ( SELECT COUNT(*) AS c FROM q ) SELECT AVG(val)::float8 FROM ( SELECT val FROM q LIMIT 2 - MOD((SELECT c FROM cnt), 2) OFFSET GREATEST(CEIL((SELECT c FROM cnt) / 2.0) - 1,0) ) q2; $$ LANGUAGE sql IMMUTABLE; DROP AGGREGATE IF EXISTS median(numeric); -- old method DROP AGGREGATE IF EXISTS median(anyelement); CREATE AGGREGATE median(anyelement) ( SFUNC=array_append, STYPE=anyarray, FINALFUNC=median, INITCOND='{}' ); COMMIT;