Oracle listagg去重distinct三种方法总结

Oracle listagg去重distinct三种方法总结一、简介最近在工作中,在写oracle统计查询的时候,遇到listagg聚合函数分组聚合之后出现很多重复数据的问题,于是研究了一下listagg去重的几种方法,以下通过实例讲解三种实现listagg去重的方法。二、方法首先还原listagg聚合之后出现重复数据的现象,打开plsql,执行如下sql:selectt.department_namedepname,…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、简介

最近在工作中,在写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

运行结果:

Oracle listagg去重distinct三种方法总结

如图,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

Oracle listagg去重distinct三种方法总结

如上图,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),
                      '([^,]+)(,\1)*(,|$)',
                      '\1\3') as class_keys
  from V_YDXG_TEACHER_KNSRDGL t
 group by t.department_key, t.department_name;

Oracle listagg去重distinct三种方法总结

这种方式处理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;

Oracle listagg去重distinct三种方法总结

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

三、总结

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196385.html原文链接:https://javaforall.net

(1)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mac android 录屏软件,mac录屏怎么录内置声音?详细的解决方案[通俗易懂]

    mac android 录屏软件,mac录屏怎么录内置声音?详细的解决方案[通俗易懂]原标题:mac录屏怎么录内置声音?详细的解决方案mac录屏怎么录内置声音?大家使用Mac电脑最大的问题就是对操作系统的不熟悉,就像是刚接触Windows系统一样,开始都会有一定的不熟悉,其实并没有那么难。很多人会使用QuickTimePlayer工具来操作,但实际上很多人在实际上操作这个方法来录制屏幕的时候会没有声音,这种情况还挺多的。比如现在拥有一个场景:有一个很萌或者很有用的视频,无法下载到…

    2022年4月30日
    76
  • tcp和udp的区别和使用场景_TCP跟UDP有什么不同

    tcp和udp的区别和使用场景_TCP跟UDP有什么不同TCPTCP是一种面向有连接的传输层协议,能够对自己提供的连接实施控制。适用于要求可靠传输的应用,例如文件传输。UDPUDP是一种面向无连接的传输层协议,不会对自己提供的连接实施控制。适用于实时应用,例如:IP电话、视频会议、直播等。…

    2022年9月20日
    0
  • MySQL安装配置教程(超级详细、保姆级)

    MySQL安装配置教程(超级详细、保姆级)一、下载MySQLMysql官网下载地址https://downloads.mysql.com/archives/installer/1.选择想要安装的版本,本篇文章选择的是5.7.31版本,下面的那个文件,点击Download下载二、安装MySQL1.选择设置类型双击运行mysql-installer-community-5.7.31.0.msi这里选择是自定义安装,所以直接选择“Custom”,点击“Next”“DeveloperDefault”是开发者默认

    2022年5月31日
    42
  • 手动ghost备份系统步骤_手动ghost备份图解

    手动ghost备份系统步骤_手动ghost备份图解备份前我们需要ghost,在此我提供下,在压缩文件下找到ghost百度网盘:http://pan.baidu.com/s/1mh77iWS 密码:ivxq进入ghost界面以后,按回车键,进入下一个操作界面。如下图所示:使用键盘上的方向键依次选择“Local”(本机)“Partition”(分区)“ToImage”(到镜像)然后

    2022年9月6日
    2
  • 分数的幂运算法则_根号分数化简

    分数的幂运算法则_根号分数化简1.一个数分数指数幂运算法则  1.2证明推导am/n=(am)开n次方,(a>0,m、n∈Z且n>1),证:    令(am)开n次方=b    两边取n次方,有    am=bn    am/n=am(1/n)=(bn)(1/n)=b=am开n次方   即am/n=(am)开n…

    2022年10月22日
    0
  • 在select标签中添加a标签

    在select标签中添加a标签

    2021年11月3日
    137

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号