web-dev-qa-db-fra.com

Comment faire Array_Agg () Travailler comme GROUP_CONCAT () de MySQL

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)

22
user491575

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;
40
Jason Weathered