Oracle listagg去重distinct三种方法总结
2023-06-13 09:13:43 时间
大家好,又见面了,我是你们的朋友全栈君。
一、简介
最近在工作中,在写oracle统计查询的时候,遇到listagg聚合函数分组聚合之后出现很多重复数据的问题,于是研究了一下listagg去重的几种方法,以下通过实例讲解三种实现listagg去重的方法。
二、方法
首先还原listagg聚合之后出现重复数据的现象,打开plsql,执行如下sql:
select t.department_name depname,
t.department_key,
listagg(t.class_key, ',') within group(order by t.class_key) as class_keys
from V_YDXG_TEACHER_KNSRDGL t
where 1 = 1
group by t.department_key, t.department_name
运行结果:
如图,listagg聚合之后很多重复数据,下面讲解如何解决重复数据问题。
【a】 第一种方法: 使用wm_concat() + distinct去重聚合
--第一种方法: 使用wm_concat() + distinct去重聚合
select t.department_name depname,
t.department_key,
wm_concat(distinct t.class_key) as class_keys
from V_YDXG_TEACHER_KNSRDGL t
where 1 = 1
group by t.department_key, t.department_name
如上图,listagg聚合之后没有出现重复数据了。oracle官方不太推荐使用wm_concat()来进行聚合,能尽量使用listagg就使用listagg。
【b】第二种方法:使用正则替换方式去重(仅适用于oracle字符串大小比较小的情况)
--第二种方法:使用正则替换方式去重(仅适用于oracle字符串大小比较小的情况)
select t.department_name depname,
t.department_key,
regexp_replace(listagg(t.class_key, ',') within
group(order by t.class_key),
'([^,]+)(,)*(,|$)',
'') as class_keys
from V_YDXG_TEACHER_KNSRDGL t
group by t.department_key, t.department_name;
这种方式处理listagg去重问题如果拼接的字符串太长会报oracle超过最大长度的错误,只适用于数据量比较小的场景。
【c】第三种方法:先去重,再聚合(推荐使用)
--第三种方法:先去重,再聚合
select t.department_name depname,
t.department_key,
listagg(t.class_key, ',') within group(order by t.class_key) as class_keys
from (select distinct s.class_key, s.department_key, s.department_name
from V_YDXG_TEACHER_KNSRDGL s) t
group by t.department_key, t.department_name
--或者
select s.department_key,
s.department_name,
listagg(s.class_key, ',') within group(order by s.class_key) as class_keys
from (select t.department_key,
t.department_name,
t.class_key,
row_number() over(partition by t.department_key, t.department_name, t.class_key order by t.department_key, t.department_name) as rn
from V_YDXG_TEACHER_KNSRDGL t
order by t.department_key, t.department_name, t.class_key) s
where rn = 1
group by s.department_key, s.department_name;
推荐使用这种方式,先把重复数据去重之后再进行聚合处理。
三、总结
以上就是关于listagg聚合函数去重的三种处理方法的总结,本文仅仅是笔者的一些总结和见解,仅供大家学习参考,希望能对大家有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/196385.html原文链接:https://javaforall.cn
相关文章
- 查看Oracle中的数据库一览(oracle查看有哪些库)
- Oracle数据库插入操作实战(oracle插入操作)
- 总结Oracle知识点汇总一站式学习指南(oracle知识点)
- Oracle中查看表定义的方法(oracle查看表定义)
- 解决Oracle中长字符串的方法(oracle长字符串)
- 分析Oracle数据库触发器的应用类型(oracle触发器类型)
- 深入了解Oracle触发器的类型(oracle触发器类型)
- Oracle如何设置表格列宽?25字中文文章标题:详解Oracle表格列宽设置方法(oracle列宽)
- Oracle数据同步技术实现企业数据高效同步(oracle数据同步技术)
- Oracle 数据库设置小数位数为 2,详细方法在哪里?(oracle保留2位小数)
- 解决Oracle数据库锁表问题的方法(oracle数据库锁表)
- 深入探究Oracle某用户表的结构和优化方法(oracle某用户表)
- Net访问Oracle数据库的简易方法(.net访问oracle)
- MDB数据倒入Oracle一种快捷的数据转移方法(mdb倒入oracle)
- IBM签订长期购买Oracle软件协议(ibm购买oracle)
- 结构Oracle数据库中修改两表结构的方法(oracle修改两表)
- Oracle中精准表述分钟时间的方法(oracle中的分钟表示)
- Oracle中查询指定年龄段人群的方法(oracle中查询年龄段)
- 更新Oracle中查询与更新技巧指南(oracle中查询和)
- Oracle中快捷提取字符的方法(oracle中提取字符)
- 表是否存在探究Oracle数据库中判断表是否存在的方法(oracle中怎么判断)
- 在Oracle中实现值的空值设置(oracle中将值设置空)
- Oracle DG拆除释放技术潜力(oracle dg 拆除)