Как заставить 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;