web-dev-qa-db-ja.com

mySQLからarray_agg()をgroup_concat()のように機能させる方法

だから私はこのテーブルを持っています:

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 

使用しようとすると array_agg() 名前は正しい順序で表示されず、どうやらそれらを並べ替える方法を見つけることができませんでした。 (私はpostgres 8.4を使用していました)

22
user491575

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