Postgresql组是否等效?

Postgresql组是否等效?,sql,postgresql,group-concat,string-aggregation,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\u 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\u CONCAT
,但这在这里似乎不起作用。。。是否有一种与PostgreSQL等效的方法或其他方法来实现这一点?

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

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

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

CREATE AGGREGATE array_agg (anyelement)
(
    sfunc = array_append,
    stype = anyarray,
    initcond = '{}'
);
(摘自PostgreSQL文档)

澄清:

  • 将数组强制转换为文本的结果是生成的字符串以大括号开始和结束。如果不需要,则需要通过某种方法移除这些支架
  • 将ANYARRAY强制转换为文本最能模拟CSV输出,因为包含嵌入逗号的元素在输出中以标准CSV样式双引号引用。array_to_string()或string_agg()(9.1中添加的“group_concat”函数)都没有使用嵌入的逗号引用字符串,从而导致结果列表中的元素数量不正确
  • 新的9.1 string_agg()函数不会首先将内部结果强制转换为文本。所以,如果value\u字段是整数,“string\u agg(value\u字段)”将生成一个错误。“string_agg(value_field::text)”是必需的。array_agg()方法在聚合后只需要一次转换(而不是每个值一次转换)
也可以。这更容易:

SELECT id, 
       string_agg(some_column, ',')
FROM the_table
GROUP BY id
试着这样做:

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

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

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

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

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

不是答案,但请检查。我认为最好的答案可能是另一个问题:在9.0中,您将使用listagg()获取CSV。查询应该是:选择id_字段,数组_到字符串(数组_agg(值_字段1),',','),数组_到字符串(数组_agg(值_字段2),',')从data_table GROUP BY id_Field,您不能在所有情况下都使用array_to_string。如果值_字段包含嵌入的逗号,则生成的CSV不正确。使用array_agg()并强制转换为文本可以正确地引用带有嵌入逗号的字符串。唯一需要注意的是,它还包括开始和结束的大括号,因此我的语句是“根据需要编辑”。我将进行编辑以澄清这一点。仅供参考:这里有一个链接来说明语法还允许您指定字符串(或数组,使用
array_agg
)中值的顺序,例如
string_agg(some_column),“order BY some_column”
甚至
string_agg(姓氏| |',“|名',”order BY姓氏,名)
distinct与string_agg一起使用非常棒,因此可以使用
string_agg(distinct some_solumn,,')
注意,如果列值是不可字符串的值(即
uuid
),则可能需要将列值强制转换为
TEXT
。这看起来像
string_agg(某些列::text,,”)
如果列类型为整数,请不要忘记转换或使用concat(列“”)进行隐式转换,string_agg(值,,”)只能在
值为字符串时使用。例如,如果
是整数
需要强制转换为字符串状
值::字符变化
是否可以执行类似于中的操作,在中按特定顺序进行聚合?您将如何处理按一列分组和按另一列排序(例如,在纵向数据集中连接变量)?为什么在内部查询中执行
orderby
?“命令不会丢失吗?重复回答,”五年前@max_spy曾说过同样的话ago@EmilVikström:你有权利犯错,但要仔细阅读。这不仅不同,我还举了一个例子,它可以处理数组类型的邮政编码,比如字符变化(5)[]
。另外,我已经验证了出于我的目的,需要-unest,否则您将看到
错误:无法累积不同维度的数组
。我对它进行了测试,但没有成功:42883:function listag(text,unknown,text)不存在Storacle的语法和功能与postgres不同。
select
  array_to_string(
    array(select distinct unnest(zip_codes) from table),
    ', '
);
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