在postgre数据中有张表,编号存在重复:
现在需要将重复编号的记录按编号合并成一条,如下:
在postgre中可通过函数 array_agg和array_to_string来实现,具体如下:
create table ccc as
select
bh,
array_to_string(array_agg(xzqdm), '、') as xzqdm,
array_to_string(array_agg(xzqmc), '、') as xzqmc
from
aaa
group by
bh;
解释:
一、array_agg
函数
作用:将多行数据聚合为一个数组。
语法:array_agg(expression [ORDER BY ...])
特点:
- 支持对字段值分组后合并为数组形式,常用于
GROUP BY
分组查询。 - 可搭配
ORDER BY
对合并结果排序。 - 结果类型为数组(如
integer[]
、text[]
等)。
示例:
-- 按部门分组,合并员工姓名到数组
SELECT department_id, array_agg(employee_name ORDER BY hire_date)
FROM employees
GROUP BY department_id;
二、array_to_string
函数
作用:将数组转换为字符串,并用指定分隔符连接元素。
语法:array_to_string(array_expression, delimiter)
特点:
- 直接处理数组类型数据,输出字符串。
- 常用于将
array_agg
的结果转换为易读的文本格式。
示例:
-- 将数组转换为逗号分隔的字符串
SELECT array_to_string(ARRAY['a', 'b', 'c'], ', ');
-- 输出 'a, b, c'
三、组合用法
典型场景:将分组后的多行字段值合并为单一字符串。
示例:
-- 按部门分组,合并员工姓名为逗号分隔的字符串
SELECT department_id,
array_to_string(array_agg(employee_name ORDER BY hire_date), ', ')
FROM employees
GROUP BY department_id;
四、进阶用法
-
去重与排序:
-- 去重后合并为字符串 SELECT array_to_string(array_agg(DISTINCT subject), '; ') FROM courses;
-
嵌套使用数组索引:
-- 获取数组中第一个元素 SELECT (array_agg(score))[1] FROM exams;
-
性能优化:
当处理大规模数据时,直接使用array_agg
可能导致性能问题(因内存拷贝),可考虑替代方案如unnest
结合字符串处理。