oracle 多行合并成一行
假如有如下表,其中各个i值对应的行数是不定的
- SQL> select * from t;
- I A D
- ---------- ---------- -------------------
- 1 b 2008-03-27 10:55:42
- 1 a 2008-03-27 10:55:46
- 1 d 2008-03-27 10:55:30
- 2 z 2008-03-27 10:55:55
- 2 t 2008-03-27 10:55:59
- --- 要获得如下结果,注意字符串需要按照D列的时间排序:
- 1 d,b,a
- 2 z,t
这是一个比较典型的行列转换,有好几种实现方法
1.自定义函数实现
- create or replace function my_concat(n number)
- return varchar2
- is
- type typ_cursor is ref cursor;
- v_cursor typ_cursor;
- v_temp varchar2(10);
- v_result varchar2(4000):= '';
- v_sql varchar2(200);
- begin
- v_sql := 'select a from t where i=' || n ||' order by d';
- open v_cursor for v_sql;
- loop
- fetch v_cursor into v_temp;
- exit when v_cursor%notfound;
- v_result := v_result ||',' || v_temp;
- end loop;
- return substr(v_result,2);
- end;
- SQL> select i,my_concat(i) from t group by i;
- I MY_CONCAT(I)
- ---------- --------------------
- 1 d,b,a
- 2 z,t
虽然这种方式可以实现需求,但是如果表t的数据量很大,i的值又很多的情况下,因为针对每个i值都要执行一句select,扫描和排序的次数和i的值成正比,性能会非常差。
2.使用sys_connect_by_path
- select i,ltrim(max(sys_connect_by_path(a,',')),',') a
- from
- (
- select i,a,d,min(d) over(partition by i) d_min,
- (row_number() over(order by i,d))+(dense_rank() over (order by i)) numid
- from t
- )
- start with d=d_min connect by numid-1=prior numid
- group by i;
从执行计划上来看,这种方式只需要扫描两次表,比自定义函数的方法,效率要高很多,尤其是表中数据量较大的时候:
3.使用wm_sys.wm_concat
这个函数也可以实现类似的行列转换需求,但是似乎没有办法做到直接根据另外一列排序,所以需要先通过子查询或者临时表排好序:
- SQL> select i,wmsys.wm_concat(a) from t group by i;
- I WMSYS.WM_CONCAT(A)
- ---------- --------------------
- 1 b,a,d
- 2 z,t
- SQL> select i,wmsys.wm_concat(a)
- 2 from
- 3 (select * from t order by i,d)
- 4 group by i;
- I WMSYS.WM_CONCAT(A)
- ---------- --------------------
- 1 d,b,a
- 2 z,t
执行计划上看,只需要做一次表扫描就可以了,但是这个函数是加密过的,执行计划并不能显示函数内部的操作。
转载于:https://www.cnblogs.com/lingbaozhangqian/p/3599962.html
oracle 多行合并成一行相关推荐
- mysql和sqlserver共存_mysql 和sqlserver的 多行合并成一行
mysql 和sqlserver的 多行合并成一行 mysql 多行合并: mysql 内置函数 group_concat(exper SEPARATOR " " ) expe ...
- ELK下logstash收集java日志,多行合并成一行
介绍 使用codec的multiline插件实现多行匹配,这是一个可以将多行进行合并的插件,而且可以使用what指定将匹配到的行与前面的行合并还是和后面的行合并. 1.java日志收集测试 input ...
- [Pandas] 多行合并成一行
美图欣赏2022/09/16 在最近的需求开发中,有如下需求需要进行修改,数据源demo如下所示 根据字段'material'进行分组,对字段'site'进行合并,内容之间用逗号(,)分隔,再进行去重 ...
- (总结)Linux下多行合并成一行,中间加分隔符
将某个目录下的文件合并成一行,中间用冒号(:)作为分隔符 1.paste ls lib | sed 's@^@lib/@g' | paste -s -d ":" 2. tr ls ...
- logstash收集java日志,多行合并成一行
使用codec的multiline插件实现多行匹配,这是一个可以将多行进行合并的插件,而且可以使用what指定将匹配到的行与前面的行合并还是和后面的行合并. 1.java日志收集测试 input {s ...
- mysql多行合并成一行_数据文件合并与拆分
[摘要] 本文介绍将多个文本文件和 Excel 文件合并成一个文件,或者将一个文件拆分成几个小文件时,如何处理会遇到的几种情况,并用 esProc SPL 举例实现. 在数据处理业务中,经常要把文件结 ...
- HTML 表格合并(表格合并行属性 rowspan 将多行合并成一行)
<table border="1"> <tr> <td colspan="3" >用户信 ...
- 怎么把好几行弄成一行_将多行内容合并成一行的两种方式
在利用Unix操作系统在实现一些具体应用的时候,可能需要把某些显示的结果进行行与行之间的合并.如现在需要用Unix操作系统设计一个彩票软件,每一张彩票上最多可以打印五注内容.在Unix操作系统的数据文 ...
- Oracle多行数据合并成一行
Oracle多行数据合并成一行 一.listagg 函数------(有长度限制) SELECT listagg(待拼接字段, ',') within group(ORDER BY 待拼接字段) AS ...
最新文章
- Alpha版本项目展示
- 哈工大成立人工智能研究院,NLP全国前三
- 神经网络检测三相电机缺相
- 红外防水摄像机相关配件选购小窍门
- Android - N级树形结构实现
- Java中可变长参数的使用及注意事项
- void与void*详解
- VMware vSphere 服务器虚拟化之十七 桌面虚拟化之安装View链接服务器
- 关于软件测试学习心得
- NeurIPS 2021 | 图像损坏场景下行人重识别新基准
- 科学与技术名词解释计算机病毒,名词解释计算机病毒
- android蓝牙设置特征属性,Android BLE蓝牙详细解读(二)
- linux使用中的问题 --- (防火墙iptables -F)
- Linux软件安装及修改软件源
- PLSQL Developer13破解汉化
- ISO-IEC 系列 国际标准组织官方标准文档 下载地址直达
- 已解决:不小心卸载pip后(重新安装pip的两种方式)
- 【专栏必读】王道考研408数据结构万字笔记、题目题型总结、注意事项、目录导航和思维导图
- vnc远程连接,5个步骤教你如何轻松实现vnc远程连接
- JAVA 处理带AM 或 PM的时间
热门文章
- Android工程师面试该怎么准备?年薪50W
- 【深度学习】论文EMO单眼识别分析
- python【数据结构与算法】战争之城(分支限界法)
- 【网页前端设计Front end】HTML语言基础.下(看不懂你来打我)
- Android移动开发之【Android实战项目】DAY2-使用Fragment实现底部菜单栏
- c语言程序设计迷宫,C语言程序设计课程设计-迷宫.doc
- 武汉网络推广介绍如何通过简化标题来提升主关键词排名?
- 网络推广网站解析为什么有些网站有收录却没流量?
- 网络营销外包——网络营销外包专员如何做好网站锚文本优化?
- 网络营销——网络营销专员浅析网站快照更新要点