28

所以我有这张桌子:

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
有没有办法可以在 postgresql 中使用它?

如果我尝试使用array_agg()名称将不会以正确的顺序显示,显然我无法找到对它们进行排序的方法。(我使用的是 postgres 8.4 )

4

1 回答 1

47

在 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;
于 2010-10-31T04:00:30.113 回答