- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章postgresql合并string_agg函数的实例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1 有时候我们会需要将多条数据根据一些特别的字段做一些合并。比如下面这个查询,正常会查询出3条数据,但是我们会希望根据create_by 分成两列显示 。
2 这时候需要用到string_agg函数,先通过group by分组,在进行合并,当然查询结果需要满足group by的限制;sql语句:
1
2
|
select
create_by,string_agg(videoname,
','
)
as
videonames
from
w008_video_addr_info
where
id
in
(4248,538,546)
group
by
create_by
|
查询结果:
3 复杂一些的应用场景(子查询):
下面的语句是我用来查询一个学生在什么时间看了哪些视频:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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 。
1
|
array_agg(expression)
|
把表达式变成一个数组 一般配合 array_to_string() 函数使用 。
1
|
string_agg(expression, delimiter)
|
直接把一个表达式变成字符串 。
案例:
1
2
3
4
5
6
7
8
9
10
11
|
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:
1
2
3
4
5
|
select
deptno, string_agg(ename,
','
)
from
jinbo.employee
group
by
deptno;
deptno | string_agg
--------+--------------
20 | JONES
30 | ALLEN,MARTIN
|
方法2:
1
2
3
4
5
|
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 倒叙合并 。
1
2
3
4
5
|
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 。
1
2
3
4
5
|
select
deptno, array_agg(ename)
from
jinbo.employee
group
by
deptno;
deptno | array_agg
--------+----------------
20 | {JONES}
30 | {ALLEN,MARTIN}
|
array_agg 去重元素,例如查询所有的部门 。
1
2
3
4
5
6
7
8
9
10
11
|
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)
|
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我。如有错误或未考虑完全的地方,望不吝赐教.
原文链接:https://blog.csdn.net/qxianx/article/details/81985615 。
最后此篇关于postgresql合并string_agg函数的实例的文章就讲到这里了,如果你想了解更多关于postgresql合并string_agg函数的实例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有以下查询: WITH cteCountryLanguageMapping AS ( SELECT * FROM ( VALUES ('Spain',
我尝试在条件生成器中创建一个函数,但执行时得到以下结果。 CriteriaBuilder builder = manager.getCriteriaBuilder(); CriteriaQue
我已下载并安装了 SQL Server 2016。当我尝试使用 STRING_AGG 函数时,收到此错误。这是我的代码: SELECT STRING_AGG(cast(FieldNumber AS V
我运行以下查询 string_agg(DISTINCT grades, '|'),它按 01|02|03|04|05|KG|PK 的顺序执行并输出我的结果。 如何以这种方式重新排列 PK|KG|01|
我想像这样限制 string_agg 结果:- SELECT string_agg(name, ',') FROM table_a WHERE 'condition' LIMIT 5 但是限制部分不起
我有一个查询,在某个时候有两个聚合: string_agg(requirements, '@') as req, string_agg(name, ',') as name 稍后在代码中,我拆分了聚合
我有以下选择 $repairs = DB::select(DB::raw(' select r.id repair_id, w.name, w.surname
我有关系数据库并且想使用 string_agg() 因为它似乎符合我的需要。 我想要: product_id | quiz_id -----------+---------- 1 |
我的 MSSQL 服务器中有一张表,我们称之为 blogPost .我还有两个标签表,让我们称它们为 fooTag和 barTag .标签表用于标记 blogPost结构相同的表。 blogPost
我在 Bigquery 中遇到了 STRING_AGG 问题。 我想: SELECT id, institution, COUNT(DISTINCT institution) OVER (PA
我的查询如下: select u.Id, STRING_AGG(sf.Naziv, ', ') as 'Ustrojstvena jedinica', ISNULL(CONVE
我有一个像这样的表#tmp: recid DefaultDimension DefaultDimensionName line_no 5637423499 Default
我在使用 STRING_AGG 并使用定界符内的表达式时遇到了一个非常奇怪的行为。结果是偏移的(即下一次迭代显示在分隔符所在的位置)。 我有一个包含社区名称的列,我试图将它们连接成一个字符串,以便稍后
我正在尝试按照他们登录的顺序生成一串名称。我有可用的代码,但它很丑陋,我确信我错过了一个更直接的方法。 目标,按照上次登录的顺序返回一串不同的用户名。 我先列出姓名和日期。 我为每个名字选择了最近的一
我用一个函数解决了这个问题,我喜欢我的解决方案,但我想知道是否有一种方法可以不使用函数来解决这个问题。事情是这样的: 有四个表与此相关: entities:系统的实体(租户) members:一个实体
如何对转换后的字段进行排序。有类似的问题,但是我不知道为什么它对我不起作用 -- 'number' 字段是一个整数 string_agg(distinct cast(number as varchar
我正在尝试运行此查询 SELECT u.*, string_agg(CAST(uar.roleid AS VARCHAR(100)), ',') AS roleids, string_agg(CAS
我有三个表。 Students student_id | name 1 Rhon Subjects subject_id | subject_name | student_id
下面的string_agg函数是否可以限制元素个数? string_agg(distinct(tag),', ') 最佳答案 还有两种方式。 1) 从行创建一个数组,限制它,然后连接成字符串: SE
我有一张 table : CREATE TABLE tblproducts ( productid integer, product character varying(20) ) 随着行数: INS
我是一名优秀的程序员,十分优秀!