J'ai donc cette table:
create table test (
id integer,
rank integer,
image varchar(30)
);
Ensuite, certaines valeurs:
id | rank | image
---+------+-------
1 | 2 | bbb
1 | 3 | ccc
1 | 1 | aaa
2 | 3 | c
2 | 1 | a
2 | 2 | b
Je veux les regrouper par ID et concaténer le nom de l'image dans l'ordre donné par rang. Dans MySQL, je peux faire ceci:
select id,
group_concat( image order by rank asc separator ',' )
from test
group by id;
Et la sortie serait:
[.____] 1 AAA, BBB, CCC [.____] 2 A, B, C
Si j'essaie d'utiliser array_agg () Les noms ne montreront pas dans le bon ordre et apparemment, je n'ai pas pu trouver un moyen de les trier. (J'utilisais Postgres 8.4)
Dans PostgreSQL 8.4, vous ne pouvez pas commander explicitement array_agg
Mais vous pouvez y travailler en commandant les lignes transmises au groupe/agrégat avec une sous-requête:
SELECT id, array_to_string(array_agg(image), ',')
FROM (SELECT * FROM test ORDER BY id, rank) x
GROUP BY id;
Dans PostgreSQL 9.0 Les expressions globales peuvent avoir une ORDER BY
Clause:
SELECT id, array_to_string(array_agg(image ORDER BY rank), ',')
FROM test
GROUP BY id;