как заставить array_agg () работать как group_concat () из mySQL - PullRequest
22 голосов
/ 29 октября 2010

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

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 aaa,bbb,ccc 2 a,b,c Есть ли способ, которым я могу иметь это в postgresql?

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

1 Ответ

40 голосов
/ 31 октября 2010

В 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;
...