繁体   English   中英

Postgresql GROUP_CONCAT 等效?

[英]Postgresql GROUP_CONCAT equivalent?

我有一张表,我想为每个 id 拉一行,并连接字段值。

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

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

我想拨打 output:

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

在 MySQL 中,我能够使用聚合 function GROUP_CONCAT ,但这似乎在这里不起作用......是否有 PostgreSQL 的等效项,或其他方法来完成此操作?

从 9.0 开始,这更加容易:

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

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

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

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

在 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() 方法只需要在聚合之后进行一次转换(而不是对每个值进行一次转换)。
SELECT array_to_string(array(SELECT a FROM b),', ');

也会这样做。

试试这样:

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

假设表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"

KI

以及适用于数组类型的版本:

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

我对 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   

根据我的经验,我将 bigint 作为列类型。 所以下面的代码对我有用。 我正在使用 PostgreSQL 12。

类型转换在这里发生。 (::文本)

string_agg(some_column::text, ',')

希望下面的 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM