当前位置:   article > 正文

Oracle listagg去重distinct三种方法总结_listagg within group去重

listagg within group去重

一、简介

最近在工作中,在写oracle统计查询的时候,遇到listagg聚合函数分组聚合之后出现很多重复数据的问题,于是研究了一下listagg去重的几种方法,以下通过实例讲解三种实现listagg去重的方法。

二、方法

首先还原listagg聚合之后出现重复数据的现象,打开plsql,执行如下sql:

  1. select t.department_name depname,
  2. t.department_key,
  3. listagg(t.class_key, ',') within group(order by t.class_key) as class_keys
  4. from V_YDXG_TEACHER_KNSRDGL t
  5. where 1 = 1
  6. group by t.department_key, t.department_name

运行结果:

如图,listagg聚合之后很多重复数据,下面讲解如何解决重复数据问题。

【a】 第一种方法: 使用wm_concat() + distinct去重聚合

  1. --第一种方法: 使用wm_concat() + distinct去重聚合
  2. select t.department_name depname,
  3. t.department_key,
  4. wm_concat(distinct t.class_key) as class_keys
  5. from V_YDXG_TEACHER_KNSRDGL t
  6. where 1 = 1
  7. group by t.department_key, t.department_name

如上图,listagg聚合之后没有出现重复数据了。oracle官方不太推荐使用wm_concat()来进行聚合,能尽量使用listagg就使用listagg。

【b】第二种方法:使用正则替换方式去重(仅适用于oracle字符串大小比较小的情况)

  1. --第二种方法:使用正则替换方式去重(仅适用于oracle字符串大小比较小的情况)
  2. select t.department_name depname,
  3. t.department_key,
  4. regexp_replace(listagg(t.class_key, ',') within
  5. group(order by t.class_key),
  6. '([^,]+)(,\1)*(,|$)',
  7. '\1\3') as class_keys
  8. from V_YDXG_TEACHER_KNSRDGL t
  9. group by t.department_key, t.department_name;

这种方式处理listagg去重问题如果拼接的字符串太长会报oracle超过最大长度的错误,只适用于数据量比较小的场景。

【c】第三种方法:先去重,再聚合(推荐使用)

  1. --第三种方法:先去重,再聚合
  2. select t.department_name depname,
  3. t.department_key,
  4. listagg(t.class_key, ',') within group(order by t.class_key) as class_keys
  5. from (select distinct s.class_key, s.department_key, s.department_name
  6. from V_YDXG_TEACHER_KNSRDGL s) t
  7. group by t.department_key, t.department_name
  8. --或者
  9. select s.department_key,
  10. s.department_name,
  11. listagg(s.class_key, ',') within group(order by s.class_key) as class_keys
  12. from (select t.department_key,
  13. t.department_name,
  14. t.class_key,
  15. row_number() over(partition by t.department_key, t.department_name, t.class_key order by t.department_key, t.department_name) as rn
  16. from V_YDXG_TEACHER_KNSRDGL t
  17. order by t.department_key, t.department_name, t.class_key) s
  18. where rn = 1
  19. group by s.department_key, s.department_name;

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

三、总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/970849
推荐阅读
相关标签
  

闽ICP备14008679号