一、简介

最近在工作中,在写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_keysfrom V_YDXG_TEACHER_KNSRDGL twhere 1 = 1group 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_keysfrom V_YDXG_TEACHER_KNSRDGL twhere 1 = 1group 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, ',') withingroup(order by t.class_key),'([^,]+)(,\1)*(,|$)','\1\3') as class_keysfrom V_YDXG_TEACHER_KNSRDGL tgroup 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_keysfrom (select distinct s.class_key, s.department_key, s.department_namefrom V_YDXG_TEACHER_KNSRDGL s) tgroup 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_keysfrom (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 rnfrom V_YDXG_TEACHER_KNSRDGL torder by t.department_key, t.department_name, t.class_key) swhere rn = 1group by s.department_key, s.department_name;

推荐使用这种方式,先把重复数据去重之后再进行聚合处理。

三、总结

以上就是关于listagg聚合函数去重的三种处理方法的总结,本文仅仅是笔者的一些总结和见解,仅供大家学习参考,希望能对大家有所帮助。

Oracle listagg去重distinct三种方法总结相关推荐

  1. SQL去重的三种方法汇总

    SQL去重的三种方法汇总 这里的去重是指:查询的时候, 不显示重复,并不是删除表中的重复项 1.distinct去重 注意的点:distinct 只能一列去重,当distinct后跟大于1个参数时,他 ...

  2. Oracle数据库备份与恢复的三种方法

    Oracle数据库备份与恢复的三种方法 Oracle数据库有三种标准的备份方法,它们分别是导出/导入(EXP/IMP).热备份和冷备份.导出备件是一种逻辑备份,冷备份和热备份是物理备份. 一. 导出/ ...

  3. Oracle新建数据库的三种方法

    Oracle新建数据库的三种方法 1.通过运行Oracle Database Configuration Assistant 创建.配置.或删除数据库(也可在命令行下输入dbca): 2.用命令行的方 ...

  4. sql oracle分页查询,【SQL】Oracle分页查询的三种方法-Oracle

    [SQL]Oracle分页查询的三种方法 采用伪列 rownum 查询前10条记录 [sql] select * from t_user t where ROWNUM <10; 按照学生ID排名 ...

  5. oracle创建数据库的三种方法

    新建Oracle数据库三种方法: 1.通过运行Oracle Database Configuration Assistant创建配置或删除数据库(也可在命令行下输入dbca): 2.用命令行的方式建立 ...

  6. es6数组去重的三种方法

    1.es6的三种方法 let arr = [2, 5, 3, 3, 5, 7, 3, 7, 3, 7, 2, 2]// (1)拓展运算符 + new Set 方法let narr1 = [...new ...

  7. List去重的三种方法,以及性能比较

    1.Collectors.collectingAndThen 这是Stream中的一个收集器,相比普通的Collectors.toList.Collectors.groupingBy等收集器 Coll ...

  8. Oracle数据库关闭的三种方法

    Oracle数据库关闭应该用什么方法呢?下面就教您三种最常用的Oracle数据库关闭的方法,希望对您学习Oracle数据库关闭方面有所启迪. 1.正常关闭 正常关闭数据库所用的选项是normal,数据 ...

  9. SQL:数据去重的三种方法

    1.使用distinct去重 distinct用来查询不重复记录的条数,用count(distinct id)来返回不重复字段的条数.用法注意: distinct[查询字段],必须放在要查询字段的开头 ...

  10. STL 中给 vector 去重的三种方法

    文章目录 背景 去重思路 解决方案 『一』vector, sort + unique 『二』vector + set(手动赋值) cmpSort() 定义在 Class 外 cmpSort() 定义为 ...

最新文章

  1. SpringBoot中实现quartz定时任务
  2. 玩Android微信小程序版
  3. mysql update 加减乘除运算
  4. spring boot 缓存_SpringBoot 应用 Redis 声明式缓存
  5. 转:java中static、final、static final的区别
  6. 杀死 Oculus ,Facebook 改名 Meta ,是押注元宇宙还是“金蝉脱壳”?
  7. 转载-zookeeper在kafka中的作用
  8. 背景图的属性(backgroud)
  9. popoverController简单介绍
  10. 想要实现自动驾驶?高精度地图不可或缺
  11. QCC3024/QCC3020/QCC3034 对讲机(Intercom) 蓝牙耳机 替代CSR8670
  12. 为什么Word 里表格文字无法垂直居中?明明已经设置垂直居中了
  13. 计算机音乐第二十首,二十首励志歌曲
  14. 国际标准化比率 INR
  15. 全新版大学英语综合教程第二册学习笔记(原文及全文翻译)——5A - True Height(真正的高度)
  16. java bounce tale_bouncetales蹦球传说安卓版
  17. 进销存设计中的库存设计
  18. Unity 自学成长路线总结
  19. 动软多数据库链接类实例
  20. 入门文献复现——Murphy C K——Combining belief functions when evidence conflicts

热门文章

  1. python3 读取文件夹的文件标题,提取小数,并计算数字和
  2. 判断iOS机器是否支持TouchId, FaceId
  3. 创建CocoaPods的Framework Swift组件化之路(下)
  4. docker删除es数据_docker使用系列之-(6).docker常用命令
  5. Harnessing Your Zombies to Help You
  6. 特征和多项式回归--machine learning
  7. 计算机网络与应用在线作业,北航《计算机网络与应用》在线作业一15秋满分答案...
  8. 电脑太慢了最简单的办法怎么弄_最简单的电脑端微信多开方法
  9. [LeetCode][easy]Rank Transform of an Array
  10. java基础学习(8)4种引用类型简析StrongReference、 SoftReference、 WeakReference 、PhantomReference