Postgresql GROUP_CONCAT等价?

时间:2010-04-01 14:09:54

标签: sql postgresql group-concat string-aggregation

我有一个表,我想在每个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,或其他方法来实现这一点?

7 个答案:

答案 0 :(得分:229)

Since 9.0这更容易:

SELECT id, 
       string_agg(some_column, ',')
FROM the_table
GROUP BY id

答案 1 :(得分:206)

这可能是一个很好的起点(仅限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样式的输出中是双引号。 array_to_string()或string_agg()(9.1中添加的“group_concat”函数)都不引用带有逗号的字符串,导致结果列表中的元素数量不正确。
  • 新的9.1 string_agg()函数不会先将内部结果强制转换为TEXT。因此,如果value_field是整数,则“string_agg(value_field)”将生成错误。 “string_agg(value_field :: text)”将是必需的。 array_agg()方法在聚合后只需要一次强制转换(而不是每个值的强制转换)。

答案 2 :(得分:41)

SELECT array_to_string(array(SELECT a FROM b),', ');

也会这样做。

答案 3 :(得分:12)

试试这样:

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

答案 4 :(得分:0)

我对Postgresql的建议

SELECT cpf || ';' || nome || ';' || telefone  
FROM (
      SELECT cpf
            ,nome
            ,STRING_AGG(CONCAT_WS( ';' , DDD_1, TELEFONE_1),';') AS telefone 
      FROM (
            SELECT DISTINCT * 
            FROM temp_bd 
            ORDER BY cpf DESC ) AS y
      GROUP BY 1,2 ) AS x   

答案 5 :(得分:0)

以及要在数组类型上使用的版本:

select
  array_to_string(
    array(select distinct unnest(zip_codes) from table),
    ', '
);

答案 6 :(得分:0)

希望下面的Oracle查询有效。

Select First_column,LISTAGG(second_column,',') 
    WITHIN GROUP (ORDER BY second_column) as Sec_column, 
    LISTAGG(third_column,',') 
    WITHIN GROUP (ORDER BY second_column) as thrd_column 
FROM tablename 
GROUP BY first_column