这篇文章主要介绍了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 listagg去重distinct的三种方式总结
基础教程推荐
- mysql时间字段默认设置为当前时间实例代码 2022-08-31
- Redis GEORADIUS命令 2024-04-06
- 如何保障mysql和redis之间的数据一致性 2024-04-25
- 浅谈数据库优化方案 2024-02-16
- 详解Redis连接命令使用方法 2024-03-23
- Mysql查看死锁与解除死锁的深入讲解 2024-02-14
- SQL Server之SELECT INTO 和 INSERT INTO SELECT案例详解 2024-02-13
- MySQL索引优化之适合构建索引的几种情况详解 2023-12-29
- mysql服务启动却连接不上的解决方法 2023-12-08
- Redis配置项汇总 2024-04-04
