C'est un postgres construit en quelques versions depuis un si vous ne avez plus besoin de définir vos propres, le nom est 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}
(c'est postgres 8.4.8).
Notez qu'aucun ORDER BY n'est spécifié, donc l'ordre des lignes de résultats dépend de la méthode de regroupement utilisée (ici, hash), c'est-à-dire qu'elle n'est pas définie. Exemple:
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}
Maintenant, je ne sais pas pourquoi vous obtenez {10,2,4,6,8} et {9,7,3,1,5}, depuis generate_series() doit envoyer le rangées dans l'ordre.
Voir ici: http://stackoverflow.com/questions/43870/how-to-concatenate-strings-of-a-string-field-in-a-postgresql-group-by-query – Quassnoi