Порядок agg массива PostgreSQL


стол 'животные':

animal_name animal_type
Tom         Cat
Jerry       Mouse
Kermit      Frog

запрос:

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
2 58

2 ответа:

Если вы находитесь на PostgreSQL Версии

от:http://www.postgresql.org/docs/8.4/static/functions-aggregate.html

в текущей реализации, порядок ввода в принципе не определена. Однако предоставление входных значений из отсортированного подзапроса обычно будет работать. Например:

выберите xmlagg(х) из (выберите X из того, тест на Y по убыванию) как вкладку;

Так что в вашем случае нужно написать:

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;

вход в array_agg будет неупорядоченным, но он будет одинаковым в обоих столбцах. И если вам нравится, вы можете добавить ORDER BY предложение к подзапросу.

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

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