Postgresql GROUP_CONCAT相当于?

我有一个表,我想每个ID拉字段值连接一行。

例如,在我的桌子上,我有这个:

TM67 | 4 | 32556 TM67 | 9 | 98200 TM67 | 72 | 22300 TM99 | 2 | 23009 TM99 | 3 | 11200 

我想输出:

 TM67 | 4,9,72 | 32556,98200,22300 TM99 | 2,3 | 23009,11200 

在MySQL中,我能够使用聚合函数GROUP_CONCAT ,但似乎并没有在这里工作…是否有一个相当于PostgreSQL,或另一种方式来实现呢?

这可能是一个很好的起点(仅版本8.4+):

 SELECT id_field, array_agg(value_field1), array_agg(value_field2) FROM data_table GROUP BY id_field 

array_agg返回一个数组,但是你可以将CAST转换为文本并根据需要进行编辑(参见下面的说明)。

在版本8.4之前,你必须在使用之前自己定义它:

 CREATE AGGREGATE array_agg (anyelement) ( sfunc = array_append, stype = anyarray, initcond = '{}' ); 

(从PostgreSQL文档转述)

澄清:

  • 将数组转换为文本的结果是生成的字符串以花括号开始和结束。 这些大括号需要通过某种方法删除,如果他们不需要。
  • 将ANYARRAY投射到TEXT最能模拟CSV输出,因为包含嵌入逗号的元素在标准CSV样式的输出中被双引号引用。 在9.1中添加了引用带有嵌入逗号的字符串array_to_string()或string_agg()(“group_concat”函数),导致结果列表中的元素数量不正确。
  • 新的9.1 string_agg()函数不会先将内部结果转换为TEXT。 所以如果value_field是一个整数,那么“string_agg(value_field)”会产生一个错误。 “string_agg(value_field :: text)”将是必需的。 array_agg()方法在聚合之后只需要一次强制转换(而不是每个值强制转换)。

从9.0开始,这更容易:

 SELECT id, string_agg(some_column, ',') FROM the_table GROUP BY id 
 SELECT array_to_string(array(SELECT a FROM b),', '); 

会做得很好。

尝试像这样:

 select field1, array_to_string(array_agg(field2), ',') from table1 group by field1; 
Interesting Posts