Подтвердить что ты не робот

PostgreSQL array_agg order

Таблица "животные":

animal_name animal_type
Tom         Cat
Jerry       Mouse
Kermit      Frog

Query:

SELECT 
array_to_string(array_agg(animal_name),';') animal_names,
array_to_string(array_agg(animal_type),';') animal_types
FROM animals;

Ожидаемый результат:

Tom;Jerry;Kerimt, Cat;Mouse;Frog
OR
Tom;Kerimt;Jerry, Cat;Frog;Mouse

Могу ли я быть уверенным, что порядок в первой агрегированной функции всегда будет таким же, как и во втором. Я имею в виду, что я бы хотел получить:

Tom;Jerry;Kermit, Frog;Mouse,Cat
4b9b3361

Ответ 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 > предложение.

Ответ 2

Используйте ORDER BY, как этот пример из руководства :

SELECT array_agg(a ORDER BY b DESC) FROM table;