Este es un postgres incorporados desde algunas versiones por lo que ya no tendrá que definir su propio, el nombre es ARRAY_AGG().
test=> select array_agg(n) from generate_series(1,10) n group by n%2;
array_agg
--------------
{1,3,5,7,9}
{2,4,6,8,10}
(esto es postgres 8.4.8).
Tenga en cuenta que no se especifica ORDER BY, por lo que el orden de las filas de resultados depende del método de agrupación utilizado (aquí, hash), es decir, no está definido. Ejemplo:
test=> select n%2, array_agg(n) from generate_series(1,10) n group by (n%2);
?column? | array_agg
----------+--------------
1 | {1,3,5,7,9}
0 | {2,4,6,8,10}
test=> select (n%2)::TEXT, array_agg(n) from generate_series(1,10) n group by (n%2)::TEXT;
text | array_agg
------+--------------
0 | {2,4,6,8,10}
1 | {1,3,5,7,9}
Ahora, yo no sé por qué se obtiene 10,2,4,6,8 {} y {9,7,3,1,5}, ya que generate_series() debe enviar el filas en orden
Ver aquí: http://stackoverflow.com/questions/43870/how-to-concatenate-strings-of-a-string-field-in-a-postgresql-group-by-query – Quassnoi