Подтвердить что ты не робот

Как сделать 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  

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

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

И результат будет: <Б >

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

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

4b9b3361

Ответ 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;