Oracle listagg去重distinct的三种方式总结

 更新时间:2022年11月18日 11:17:49   作者:每天都要进步一点点  
这篇文章主要介绍了Oracle listagg去重distinct的三种方式总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

一、简介

最近在工作中,在写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),
                      '([^,]+)(,\1)*(,|$)',
                      '\1\3') 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聚合函数去重的三种处理方法的总结,本文仅仅是笔者的一些总结和见解,仅供大家学习参考,希望能对大家有所帮助。也希望大家多多支持脚本之家。

相关文章

  • 索引在Oracle中的应用深入分析

    索引在Oracle中的应用深入分析

    以下是对索引在Oracle中的应用进行了深入的分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • oracle12C安装步骤(图文详解)

    oracle12C安装步骤(图文详解)

    这篇文章主要介绍了oracle12C安装步骤(图文详解),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • Oracle的约束介绍与约束维护

    Oracle的约束介绍与约束维护

    这篇文章介绍了Oracle的约束与约束维护,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • Oracle使用dblink实现跨库访问的实例代码

    Oracle使用dblink实现跨库访问的实例代码

    dbLink是简称,全称是databaselink,database link是定义一个数据库到另一个数据库的路径的对象,database link允许你查询远程表及执行远程程序,本文给大家介绍了Oracle如何使用dblink实现跨库访问,需要的朋友可以参考下
    2024-03-03
  • Oracle Listener 动态注册 与 静态注册

    Oracle Listener 动态注册 与 静态注册

    注册就是将数据库作为一个服务注册到监听程序。客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库
    2015-12-12
  • Oracle数据库如何更改数据文件位置

    Oracle数据库如何更改数据文件位置

    这篇文章主要给大家介绍了关于Oracle数据库如何更改数据文件位置的相关资料,Oracle数据库的数据文件的位置和信息都被记录在控制文件中,需要的朋友可以参考下
    2023-08-08
  • Oracle收集和查看统计信息的方法

    Oracle收集和查看统计信息的方法

    统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息,下面这篇文章主要给大家介绍了关于Oracle收集和查看统计信息的方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • Oracle停止数据泵导入数据的方法详解

    Oracle停止数据泵导入数据的方法详解

    Oracle数据库在使用的过程中常常会遇到这样或那样的问题,而这些问题常常又使我们感到很困惑,下面这篇文章主要给大家介绍了关于Oracle停止数据泵导入数据的相关资料,需要的朋友可以参考下
    2022-06-06
  • Oracle SQL树形结构查询

    Oracle SQL树形结构查询

    本文介绍Oracle中使用START WITH...CONNECT BY PRIOR子句实现递归查询树形结构的方法,小伙伴们可以参考一下。
    2016-05-05
  • Oracle数据库中文显示???????解决办法

    Oracle数据库中文显示???????解决办法

    这两天刚刚使用Oracle,出现了好多不愉快的事情,下面分享一下我的一点经历,这篇文章主要给大家介绍了关于Oracle数据库中文显示???????的解决办法,需要的朋友可以参考下
    2024-04-04

最新评论