PostgreSQL array_agg order - PullRequest
       21

PostgreSQL array_agg order

79 голосов
/ 06 сентября 2011

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

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 ]

262 голосов
/ 06 сентября 2011

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

SELECT array_agg(a ORDER BY b DESC) FROM table;
25 голосов
/ 06 сентября 2011

Если вы используете версию PostgreSQL <9.0, то: </em>

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

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

ВЫБРАТЬ xmlagg (x) ОТ (ВЫБРАТЬ x ИЗ ТЕСТА ЗАКАЗА y DESC) AS вкладка;

Итак, в вашем случае вы должны написать:

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.

...