Postgresql组是否等效?
我有一个表,我希望每个id提取一行,并连接字段值 例如,在我的表格中,我有: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,但这在这里似乎不起作用。。。是否有一种
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