欢迎投稿

今日深度:

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

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


目录
  • 一、简介
  • 二、方法
    • 【a】 第一种方法
    • 【b】第二种方法
    • 【c】第三种方法
  • 三、总结

    一、简介

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

    您可能感兴趣的文章:
    • Oracle表中重复数据去重的方法实例详解
    • Oracle删除重复的数据,Oracle数据去重复
    • oracle sql 去重复记录不用distinct如何实现

    www.htsjk.Com true http://www.htsjk.com/oracle/45376.html NewsArticle Oracle listagg去重distinct的三种方式总结, 目录 一、简介 二、方法 【a】 第一种方法 【b】第二种方法 【c】第三种方法 三、总结 一、简介 最近在工作中,在写oracle统计查询的时候,遇...
    评论暂时关闭