Oracle同行合并分组

php中文网
发布: 2016-06-07 17:11:47
原创
1651人浏览过

Oracle同行合并分组,使用函数sys_connect_by_path(column,

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;

有趣的动画幻灯片
有趣的动画幻灯片

这是一个有趣的幻灯片,幻灯片的每一个部分都被分割成几块,并以不同的方式进行动画。此幻灯片适合单独使用,可用于展示海报等等。

有趣的动画幻灯片 154
查看详情 有趣的动画幻灯片

 

详细解释:

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

linux

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号