Порядок масиву_agg постгреSQL


107

Таблиця "тварини":

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
Якщо у вас 9.0, ви можете замінити вкладені дзвінки однимstring_agg()
a_horse_with_no_name

Відповіді:


27

Якщо ви використовуєте версію PostgreSQL <9.0, тоді:

Від: 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;

Вхід до масиву_agg буде не упорядкованим, але він буде однаковим в обох стовпцях. І якщо вам подобається, ви можете додати ORDER BYречення до підзапиту.


331

Використовуйте 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 (ім'я тварини), array_agg (тип тварини) ВІД тварин; ?
Григорій Кіслін

9
Зверніть увагу, що це не працює для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.