Ответ 1
Это postgres, встроенный с нескольких версий, поэтому вам больше не нужно определять свои собственные, имя 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}
(это postgres 8.4.8).
Обратите внимание, что не указан ORDER BY, поэтому порядок строк результатов зависит от используемого метода группировки (здесь, хеш), то есть он не определен. Пример:
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}
Теперь я не знаю, почему вы получаете {10,2,4,6,8} и {9,7,3,1,5}, так как generate_series() должен отправлять строки в порядке.