Postgresql GROUP_CONCAT等价?

Twi*_*Kit 237 sql postgresql group-concat string-aggregation

我有一个表,我想每个id拉一行,并且字段值连接在一起.

例如,在我的表中,我有这个:

TM67 | 4  | 32556
TM67 | 9  | 98200
TM67 | 72 | 22300
TM99 | 2  | 23009
TM99 | 3  | 11200
Run Code Online (Sandbox Code Playgroud)

我想输出:

TM67 | 4,9,72 | 32556,98200,22300
TM99 | 2,3    | 23009,11200
Run Code Online (Sandbox Code Playgroud)

在MySQL中,我能够使用聚合函数GROUP_CONCAT,但这似乎在这里不起作用...是否有等效的PostgreSQL,或其他方法来实现这一点?

a_h*_*ame 243

从9.0开始,这更容易:

SELECT id, 
       string_agg(some_column, ',')
FROM the_table
GROUP BY id
Run Code Online (Sandbox Code Playgroud)

  • 请注意,语法还允许您指定字符串(或数组,使用`array_agg`)中值的顺序,例如`string_agg(some_column,','ORDER BY some_column)`或甚至`string_agg(姓氏||',' || forename,';'ORDER BY surname,forename)` (30认同)
  • 令人敬畏的是`distinct`适用于string_agg,所以可以使用`string_agg(distinct some_solumn,',')` (7认同)
  • 请注意,如果列值是不可字符串化的值(即uuid),则可能需要将其转换为“ TEXT”。看起来像`string_agg(some_column :: text,',')` (2认同)

Mat*_*ood 222

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

SELECT id_field, array_agg(value_field1), array_agg(value_field2)
FROM data_table
GROUP BY id_field
Run Code Online (Sandbox Code Playgroud)

array_agg返回一个数组,但您可以根据需要对其进行CAST编辑和编辑(请参阅下面的说明).

在8.4版之前,您必须在使用之前自行定义:

CREATE AGGREGATE array_agg (anyelement)
(
    sfunc = array_append,
    stype = anyarray,
    initcond = '{}'
);
Run Code Online (Sandbox Code Playgroud)

(从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()方法在聚合后只需要一次强制转换(而不是每个值的强制转换).

  • 要获取CSV,查询应为:SELECT id_field,array_to_string(array_agg(value_field1),','),array_to_string(array_agg(value_field2),',')FROM data_table GROUP BY id_field (5认同)
  • 在这里所有情况下都不能使用array_to_string.如果您的value_field包含嵌入的逗号,则生成的CSV不正确.使用array_agg()并转换为TEXT正确引用带有逗号的字符串.唯一需要注意的是它还包括起始和结束花括号,因此我的声明"并根据需要进行编辑".我将编辑以澄清这一点. (2认同)

小智 45

SELECT array_to_string(array(SELECT a FROM b),', ');
Run Code Online (Sandbox Code Playgroud)

也会这样做.

  • 这个也在9.0之前工作 - 用8.4.5测试它 (5认同)

小智 14

试试这样:

select field1, array_to_string(array_agg(field2), ',')
from table1
group by field1;
Run Code Online (Sandbox Code Playgroud)


Kér*_*ián 7

假设表your_table有三列(name、id、value),查询如下:

  select name, 
         array_to_string(array_agg(id), ','), 
         array_to_string(array_agg(value), ',')
    from your_table
group by name
order by name
;

"TM67"  "4,9,72"    "32556,98200,22300"
"TM99"  "2,3"       "23009,11200"
Run Code Online (Sandbox Code Playgroud)

KI