Oracle同行合并分组

简介:

 Oracle同行合并分组

         使用函数sys_connect_by_path(column,'')的例子^^。
 
表结构为:
create table test(
bookid char(3) not null,
author varchar2(10) not null
);
 
insert into test values('001','jack');
insert into test values('001','tom');
insert into test values('002','wang');
insert into test values('002','zhang');
insert into test values('002','li');
 
commit;
 
select * from test;
显示结果为:
BOO AUTHOR
-----------------
001 jack
001 tom
002 wang
002 zhang
002 li
 
我们想得到的结果为:
BOO AUTHOR
-----------------------------
001 jack&&tom
002 wang&&zhang&&li
 
SQL 文为:

select bookid,substr(max(sys_connect_by_path(author,'&&')),3) author

from

(select bookid,author,id,lag(id) over(partition by bookid order by id) pid

--(最后一列或者为)lead(id) over(partition by bookid order by id desc) pid

from (select bookid,author,rownum id from test))

start with pid is null
connect by prior id=pid
group by bookid;
 
详细解释:
sys_connect_by_path(column,'')//column为列名,''中间加要添加的字符
这个函数本身不是用来给我们做结果集连接的(合并行),而是用来构造树路径的,所以需要和connect by一起使用。
 
test只是张普通表,怎样才能变成树结构呢?我们需要加一个pid和id。
 
id我们只需加一个rownum就好。
select bookid,author,rownum id from test;
BOO AUTHOR           ID
----------------------------
001 jack             1
001 tom              2
002 wang             3
002 zhang            4
002 li               5
 
而pid上一条记录不就是下一条记录的父节点了。这里我们需要函数lag()取前记录,和lead()相对。
//把lag(id) over(order by id) pid改成lead(id) over(order by id desc) pid效果一样

select bookid,author,id,lag(id) over(order by id) pid

from (select bookid,author,rownum id from test);

BOO AUTHOR           ID              PID
-------------------------------------------
001 jack             1
001 tom              2                1
002 wang             3                2
002 zhang            4                3
002 li               5                4
 
由于要按bookid分我们的pid,在分析函数over中我们需要加上partition by,一看下面结果我们就知道有什么不同了。

select bookid,author,id,lag(id) over(partition by bookid order by id) pid

from (select bookid,author,rownum id from test);

BOO AUTHOR           ID              PID
-------------------------------------------
001 jack             1
001 tom              2                1
002 wang             3
002 zhang            4                3
002 li               5                4
 
继续,把上述看成一张虚拟表,用到我们的sys_connect_by_path函数取出想要的值。
格式:
sys_connect_by_path(column,'')
start with 条件1
connect by 条件2(prior 子节点=父节点)
 

select bookid,sys_connect_by_path(author,'&&') author

from

(select bookid,author,id,lag(id) over(partition by bookid order by id) pid

from (select bookid,author,rownum id from test))

start with pid is null
connect by prior id=pid;
BOO AUTHOR
-----------------------------------
001 &&jack
001 &&jack&&tom
002 &&wang
002 &&wang&&zhang

002 &&wang&&zhang&&li

 
OK,离我们的结果越来越近了,现在就是一般函数的应用了。
1,以bookid分组,取author的最大值。
2,用substr(string,start,length)截掉前面多余的字符。//没第三参数默认取到结束

select bookid,substr(max(sys_connect_by_path(author,'&&')),3) author

......
group by bookid;//详细sql文,一开始已给出!
BOO AUTHOR
------------------------------
001 jack&&tom
 
002 wang&&zhang&&li
 
大功告成,^_^!
drop table test;
 

 


     本文转自winorlose2000 51CTO博客,原文链接:http://blog.51cto.com/vaero/790594,如需转载请自行联系原作者




相关文章
|
3月前
|
存储 Oracle 关系型数据库
Oracle数据库的应用场景有哪些?
【10月更文挑战第15天】Oracle数据库的应用场景有哪些?
221 64
|
26天前
|
存储 Oracle 关系型数据库
数据库数据恢复—ORACLE常见故障的数据恢复方案
Oracle数据库常见故障表现: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE ASM存储破坏。 3、ORACLE数据文件丢失。 4、ORACLE数据文件部分损坏。 5、ORACLE DUMP文件损坏。
84 11
|
2月前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—Oracle数据库文件有坏快损坏的数据恢复案例
一台Oracle数据库打开报错,报错信息: “system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。管理员联系我们数据恢复中心寻求帮助,并提供了Oracle_Home目录的所有文件。用户方要求恢复zxfg用户下的数据。 由于数据库没有备份,无法通过备份去恢复数据库。
|
2月前
|
存储 Oracle 关系型数据库
oracle数据恢复—Oracle数据库文件大小变为0kb的数据恢复案例
存储掉盘超过上限,lun无法识别。管理员重组存储的位图信息并导出lun,发现linux操作系统上部署的oracle数据库中有上百个数据文件的大小变为0kb。数据库的大小缩水了80%以上。 取出&并分析oracle数据库的控制文件。重组存储位图信息,重新导出控制文件中记录的数据文件,发现这些文件的大小依然为0kb。
|
1月前
|
存储 Oracle 关系型数据库
服务器数据恢复—华为S5300存储Oracle数据库恢复案例
服务器存储数据恢复环境: 华为S5300存储中有12块FC硬盘,其中11块硬盘作为数据盘组建了一组RAID5阵列,剩下的1块硬盘作为热备盘使用。基于RAID的LUN分配给linux操作系统使用,存放的数据主要是Oracle数据库。 服务器存储故障: RAID5阵列中1块硬盘出现故障离线,热备盘自动激活开始同步数据,在同步数据的过程中又一块硬盘离线,RAID5阵列瘫痪,上层LUN无法使用。
|
2月前
|
SQL Oracle 关系型数据库
Oracle数据库优化方法
【10月更文挑战第25天】Oracle数据库优化方法
57 7
|
2月前
|
Oracle 关系型数据库 数据库
oracle数据库技巧
【10月更文挑战第25天】oracle数据库技巧
36 6
|
2月前
|
存储 Oracle 关系型数据库
Oracle数据库优化策略
【10月更文挑战第25天】Oracle数据库优化策略
36 5
|
3月前
|
存储 Oracle 关系型数据库
数据库数据恢复—Oracle ASM磁盘组故障数据恢复案例
Oracle数据库数据恢复环境&故障: Oracle ASM磁盘组由4块磁盘组成。Oracle ASM磁盘组掉线 ,ASM实例不能mount。 Oracle数据库故障分析&恢复方案: 数据库数据恢复工程师对组成ASM磁盘组的磁盘进行分析。对ASM元数据进行分析发现ASM存储元数据损坏,导致磁盘组无法挂载。
|
3月前
|
监控 Oracle 关系型数据库
Oracle数据库性能优化
【10月更文挑战第16天】Oracle数据库性能优化是
42 1

相关实验场景

更多

推荐镜像

更多