postgresql合并string_agg函数的实例

1 有时候我们会需要将多条数据根据一些特别的字段做一些合并。比如下面这个查询,正常会查询出3条数据,但是我们会希望根据create_by 分成两列显示

2 这时候需要用到string_agg函数,先通过group by分组,在进行合并,当然查询结果需要满足group by的限制;sql语句:

select create_by,string_agg(videoname,',') as videonames from w008_video_addr_info where id in (4248,538,546)
group by create_by

查询结果:

3 复杂一些的应用场景(子查询):

下面的语句是我用来查询一个学生在什么时间看了哪些视频:

select
 sa.id,
 info.nickname,
 (select string_agg(v.videoname,',')
 from w008_school_assign_video sv
 join w008_video_addr_info v on sv.videoaddrinfo =v.id
 where sv.schoolassignment=sa.id and v.is_removed=0 and sv.is_removed=0
 group by v.is_removed) as videos,
 (select string_agg(to_char(sv.create_date, 'MM-DD HH24:MI'),',')
 from w008_school_assign_video sv
 join w008_video_addr_info v on sv.videoaddrinfo =v.id where
  sv.schoolassignment=sa.id and v.is_removed=0
 and sv.is_removed=0 group by v.is_removed) as viewtime
from w008_school_assignment sa
join w008_user_business_info info on sa.userlongid=info.id where sa.shchoolworkid=2514505674916356

结果:

当然,string_agg(field,'分隔符');分隔符可以填写其他任意的字符,方便后期处理即可;

补充:PostgreSql 聚合函数string_agg与array_agg,类似mysql中group_concat

string_agg,array_agg 这两个函数的功能大同小异,只不过合并数据的类型不同。

https://www.postgresql.org/docs/9.6/static/functions-aggregate.html

array_agg(expression)

把表达式变成一个数组 一般配合 array_to_string() 函数使用

string_agg(expression, delimiter)

直接把一个表达式变成字符串

案例:

create table(empno smallint, ename varchar(20), job varchar(20), mgr smallint, hiredate date, sal bigint, comm bigint, deptno smallint);
insert into jinbo.employee(empno,ename,job, mgr, hiredate, sal, comm, deptno) values (7499, 'ALLEN', 'SALEMAN', 7698, '2014-11-12', 16000, 300, 30);
insert into jinbo.employee(empno,ename,job, mgr, hiredate, sal, comm, deptno) values (7499, 'ALLEN', 'SALEMAN', 7698, '2014-11-12', 16000, 300, 30);
insert into jinbo.employee(empno,ename,job, mgr, hiredate, sal, comm, deptno) values (7654, 'MARTIN', 'SALEMAN', 7698, '2016-09-12', 12000, 1400, 30);
select * from jinbo.employee;
 empno | ename | job | mgr | hiredate | sal | comm | deptno
-------+--------+---------+------+------------+-------+------+--------
 7499 | ALLEN | SALEMAN | 7698 | 2014-11-12 | 16000 | 300 |  30
 7566 | JONES | MANAGER | 7839 | 2015-12-12 | 32000 | 0 |  20
 7654 | MARTIN | SALEMAN | 7698 | 2016-09-12 | 12000 | 1400 |  30
(3 rows)

查询同一个部门下的员工且合并起来

方法1:

select deptno, string_agg(ename, ',') from jinbo.employee group by deptno;
 deptno | string_agg
--------+--------------
  20 | JONES
  30 | ALLEN,MARTIN

方法2:

select deptno, array_to_string(array_agg(ename),',') from jinbo.employee group by deptno;
 deptno | array_to_string
--------+-----------------
  20 | JONES
  30 | ALLEN,MARTIN

在1条件的基础上,按ename 倒叙合并

select deptno, string_agg(ename, ',' order by ename desc) from jinbo.employee group by deptno;
 deptno | string_agg
--------+--------------
  20 | JONES
  30 | MARTIN,ALLEN

按数组格式输出使用 array_agg

select deptno, array_agg(ename) from jinbo.employee group by deptno;
 deptno | array_agg
--------+----------------
  20 | {JONES}
  30 | {ALLEN,MARTIN}

array_agg 去重元素,例如查询所有的部门

select array_agg(distinct deptno) from jinbo.employee;
array_agg
-----------
 {20,30}
(1 row)
#不仅可以去重,还可以排序
select array_agg(distinct deptno order by deptno desc) from jinbo.employee;
 array_agg
-----------
 {30,20}
(1 row)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • PostgreSQL 字符串拆分与合并案例

    我就废话不多说了,大家还是直接看代码吧~ with person_name as ( select c.id, array_to_string(array_agg(distinct p.c_name), ' , ') as p_name from biz_notification_config c join biz_notification_person p on p.id = any (string_to_array(c.persons, ',')::int[]) group by c.id

  • PostgreSQL实现批量插入、更新与合并操作的方法

    前言 就在 2019 年 1 月份微软收购了 PostgreSQL 数据库的初创公司 CitusData, 在云数据库方面可以增强与 AWS 的竟争.AWS 的 RDS 两大开源数据库就是 MySQL(Aurora 和 MariaDB 是它的变种) 和 PostgreSQL. 而 PostgreSQL 跳出了普通关系型数据库的类型约束,它灵活的支持 JSON, JSONB, XML, 数组等类型.比如说字段类型可以是各种形式的数组,一维或多维. create table t1( address

  • postgresql 实现sql多行语句合并一行

    多行语句合并一行 三个表关联查询的结果集为: SELECT users.name,users.age,users.birthday,roles.name FROM users,users_roles,roles WHERE users_roles.userid = users.id and users_roles.roleid = roles.id name age birthday role 张三 23 1993-1-1 role1 张三 23 1993-1-1 role2 张三 23 199

  • PostgreSQL 实现将多行合并转为列

    需求将下列表格相同id的name拼接起来输出成一列 id Name 1 peter 1 lily 2 john 转化后效果: id Name 1 peter:lily 2 john: 实现方式使用 array_to_string 和 array_agg 函数,具体语句如下: string_agg(expression, delimiter) 把表达式变成一个数组 string_agg(expression, delimiter) 直接把一个表达式变成字符串 select id, array_to

  • postgresql合并string_agg函数的实例

    1 有时候我们会需要将多条数据根据一些特别的字段做一些合并.比如下面这个查询,正常会查询出3条数据,但是我们会希望根据create_by 分成两列显示 2 这时候需要用到string_agg函数,先通过group by分组,在进行合并,当然查询结果需要满足group by的限制:sql语句: select create_by,string_agg(videoname,',') as videonames from w008_video_addr_info where id in (4248,53

  • PostgreSQL 正则表达式 常用函数的总结

    PostgreSQL 正则表达式 常用函数的总结 对那些需要进行复杂数据处理的程序来说,正则表达式无疑是一个非常有用的工具.本文重点在于阐述 PostgreSQL 的一些常用正则表达式函数以及源码中的一些函数. 正则相关部分的目录结构 [root@localhost regex]# pwd /opt/hgdb-core/src/include/regex [root@localhost regex]# ll total 40 -rw-r--r--. 1 postgres postgres 349

  • PHP合并数组函数array_merge用法分析

    本文实例讲述了PHP合并数组函数array_merge用法.分享给大家供大家参考,具体如下: 合并数组是把一个数组追加到另一个数组中,主要应用array_merge()函数实现 语法如下: array array_merge(array array1,array array2[,array...]); 注: 在合并时,如果输入的数组中有相同的字符串键名,则后面的值将覆盖前面的值:如果数组包含数字键名,后面的值不会覆盖原来的值,而是附加到后面 例如: $arr1=array("图书"=&

  • Python zip()函数用法实例分析

    本文实例讲述了Python zip()函数用法.分享给大家供大家参考,具体如下: 这里介绍python中zip()函数的使用: >>> help(zip) Help on built-in function zip in module __builtin__: zip(...) zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)] Return a list of tuples, where each tuple c

  • PostgreSQL游标与索引选择实例详细介绍

    之前有写过一个案例,order by limit因为数据分布不均而选择了错误的索引,这是由于优化器没法判断数据的分布关系,默认认为数据分布是均匀的所导致的. 而除了limit,当我们在使用游标时也要注意有可能会出现类似的情况.而往往这类在存储过程中的SQL我们更难发现其选择了错误的执行计划,所以需要注意. 1.建测试表 bill=# create table tbl (id int, c1 int, c2 int, c3 int, c4 int); CREATE TABLE 2.写入一批随机数据

  • C++ 中const对象与const成员函数的实例详解

    C++ 中const对象与const成员函数的实例详解 const对象只能调用const成员函数: #include<iostream> using namespace std; class A { public: void fun()const { cout<<"const 成员函数!"<<endl; } void fun() { cout<<"非const成员函数 !"<<endl; } }; int

  • web开发之对比时间大小的工具函数的实例详解

    web开发之对比时间大小的工具函数的实例详解 js时间大小比较,格式yyyy-MM-dd hh:mm:ss 把时间比较封装成一个工具函数: /** * 比较两个时间的大小 * 时间格式:yyyy-MM-dd hh:mm:ss * @param {Object} beginTime 开始时间 * @param {Object} endTime 结束时间 */ var getDataLarge = function(beginTimeString,endTimeString){ var b = be

  • python里使用正则的findall函数的实例详解

    python里使用正则的findall函数的实例详解 在前面学习了正则的search()函数,这个函数可以找到一个匹配的字符串返回,但是想找到所有匹配的字符串返回,怎么办呢?其实得使用findall()函数.如下例子: #python 3. 6 #蔡军生 #http://blog.csdn.net/caimouse/article/details/51749579 # import re text = 'abbaaabbbbaaaaa' pattern = 'ab' for match in r

  • js代码延迟一定时间后执行一个函数的实例

    实例如下: setTimeout(funcName,500); function funcName() { xxxxxx; } 0.5秒后执行funcName(),只执行一次 setInterval(funcName,5000);   每隔5秒执行一次funcName() 以上这篇js代码延迟一定时间后执行一个函数的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • php把时间戳转换成多少时间之前函数的实例

    如下所示: function wordTime($time) { $time = (int) substr($time, 0, 10); $int = time() - $time; $str = ''; if ($int <= 2){ $str = sprintf('刚刚', $int); }elseif ($int < 60){ $str = sprintf('%d秒前', $int); }elseif ($int < 3600){ $str = sprintf('%d分钟前', f

随机推荐