PostgreSQL array_agg порядок


109

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

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

7
Если вы используете string_agg()
версию

Ответы:


27

Если вы используете PostgreSQL версии <9.0, тогда:

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

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

ВЫБРАТЬ xmlagg (x) ИЗ (ВЫБРАТЬ x ИЗ тестового ЗАКАЗА ПО y DESC) КАК 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;

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


337

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

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

42
Примечание: ORDER BYin array_aggвводится в PostgreSQL 9
UlfR

6
Намного лучше, чем принятый ответ, предполагающий PostgreSQL 9+.
Эрик

1
Не могли бы вы дать образец с ORDER BY для выбора: SELECT array_agg (animal_name), array_agg (animal_type) FROM animals; ?
Григорий Кислин

10
Обратите внимание, что это не работает дляarray_agg(DISTINCT a ORDER BY b)
cerd

1
При использовании для нескольких столбцов вы должны добавлять круглые скобки:array_agg((a, b, c) ORDER BY b)
bennos
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.