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聚合函数去重的三种处理方法的总结,本文仅仅是笔者的一些总结和见解,仅供大家学习参考,希望能对大家有所帮助。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • EasyDSS流媒体服务器软件(支持RTMP/HLS/HTTP-FLV/视频点播/视频直播)-正式环境安装部署攻略

    EasyDSS流媒体服务器软件(支持RTMP/HLS/HTTP-FLV/视频点播/视频直播)-正式环境安装部署攻略EasyDSS流媒体服务器软件,提供一站式的转码、点播、直播、时移回放服务,极大地简化了开发和集成的工作。其中,点播功能主要包含:上传、转码、分发。直播功能,主要包含:直播、录像,直播支持RTMP输入,RTMP/HLS/HTTP-FLV的分发输出;录像支持自定义保存时长、检索及下载。提供丰富的二次开发接口,基于JSON的封装及HTTP调用。提供播放鉴权、推流鉴权等安全保证。提供用户及相关权限管…

  • integer常量池在哪_java 常量池

    integer常量池在哪_java 常量池常量池java中存在字符串常量池,维护了所有String对象使用Strings=”zx”的时候是使用String.valueOf(“zx”)从常量池中找了个对象返回在使用new的时候是直接创建一个新的对象Integer中也有常量池其中缓存了-128到127之间的数字(一个字节八位大小)Integera=127与Integerb=127相等吗对于对象引用类型:==比较的是对象的内存地址。对于基本数据类型:==比较的是值。如果整型字面量的值在-128到127

  • 网络协议的三要素是什么?各有什么含义?_网络协议三要素中语法规定了

    网络协议的三要素是什么?各有什么含义?_网络协议三要素中语法规定了网络协议的三要素是什么?1、语法语法用来规定信息格式。数据及控制信息的格式、编码及信号电平等。2、语义语义用来说明通信双方应当怎么做。用于协调与差错处理的控制信息。3、定时定时(时序)定义

  • Laravel5.1 路由 -路由分组

    Laravel5.1 路由 -路由分组

    2021年10月23日
  • windows server搭建邮件服务器(开源邮件服务器系统)

    使用WinmailServer轻松架设邮件服务器准备工作  WinmailServer是一款安全易用全功能的邮件服务器软件,不仅支持SMTP/POP3/IMAP/Webmail/LDAP(公共地址簿)/多域/发信认证/反垃圾邮件/邮件过滤/邮件组/公共邮件夹等标准邮件功能,还有提供邮件签核/邮件杀毒/邮件监控/支持IIS,Apache和PWS/短信提醒/邮件备份/TLS(

  • idea进入方法快捷键详情大全(idea快捷键大全最新设置)[通俗易懂]

    idea进入方法快捷键详情大全(idea快捷键大全最新设置)[通俗易懂]首页>软件应用>返回首页idea进入方法快捷键详情大全(idea快捷键大全最新设置)软件应用发布时间:2022-02-1311:05:09刚开始使用IDEA时一直都不熟悉,利用空闲的时间整理了一下常用的IDEA快捷键。1、Ctrl快捷键介绍Ctrl+F在当前文件进行文本查找Ctrl+R在当前文件进行文本替换Ctrl+Z撤销Ctrl+Y删除光标所在行或删除选中的行Ctrl+X剪切光标所在行或剪切选择内容…

发表回复

您的电子邮箱地址不会被公开。

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