Ответ 1
Если вы находитесь в версии PostgreSQL < 9.0, затем:
От: http://www.postgresql.org/docs/8.4/static/functions-aggregate.html
В текущей реализации порядок ввода в принципе неуточнен. Однако использование входных значений из отсортированного подзапроса будет работать. Например:
SELECT xmlagg (x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab;
Итак, в вашем случае вы должны написать:
SELECT
array_to_string(array_agg(animal_name),';') animal_names,
array_to_string(array_agg(animal_type),';') animal_types
FROM (SELECT animal_name, animal_type FROM animals) AS x;
Теперь вход в массив_agg будет неупорядоченным, но в обоих столбцах он будет одинаковым. И если вам нравится, вы можете добавить в подзапрос < <21 > предложение.