-- https://wiki.postgresql.org/wiki/Aggregate_Mode CREATE OR REPLACE FUNCTION _final_mode(anyarray) RETURNS anyelement AS $BODY$ SELECT a FROM unnest($1) a GROUP BY 1 ORDER BY COUNT(1) DESC, 1 LIMIT 1; $BODY$ LANGUAGE 'sql' IMMUTABLE; -- Tell Postgres how to use our aggregate CREATE AGGREGATE mode(anyelement) ( SFUNC=array_append, --Function to call for each row. Just builds the array STYPE=anyarray, FINALFUNC=_final_mode, --Function to call after everything has been added to array INITCOND='{}' --Initialize an empty array when starting );