Как заставить array_agg() работать как group_concat() из mySQL

Итак, у меня есть эта таблица:

create table test (
   id integer, 
   rank integer,
   image varchar(30)
); 

Тогда некоторые значения:

id | rank | image   
---+------+-------  
 1 |    2 | bbb  
 1 |    3 | ccc  
 1 |    1 | aaa  
 2 |    3 | c  
 2 |    1 | a  
 2 |    2 | b  

Я хочу сгруппировать их по идентификатору и объединить имя изображения в порядке, указанном по рангу. В MySQL я могу сделать это:

  select id, 
         group_concat( image order by rank asc separator ',' ) 
    from test 
group by id;

И вывод будет:

1 ааа,bbb,ccc
2 а, б, в
Есть ли способ, которым я могу иметь это в postgresql?

Если я попытаюсь использовать array_agg(), имена не будут отображаться в правильном порядке, и, очевидно, я не смог найти способ их сортировки. (Я использовал postgres 8.4)

1 ответ

Решение

В PostgreSQL 8.4 вы не можете явно заказать array_agg но вы можете обойти это, упорядочив строки, переданные в группу / агрегат с помощью подзапроса:

SELECT id, array_to_string(array_agg(image), ',')
FROM (SELECT * FROM test ORDER BY id, rank) x
GROUP BY id;

В PostgreSQL 9.0 агрегатные выражения могут иметь ORDER BY пункт:

SELECT id, array_to_string(array_agg(image ORDER BY rank), ',')
FROM test
GROUP BY id;
Другие вопросы по тегам