精华内容
下载资源
问答
  • Oracle listagg去重distinct三种方法总结

    万次阅读 2018-12-14 10:05:09
    最近在工作中,在写oracle统计查询的时候,遇到listagg聚合函数分组聚合之后出现很多重复数据的问题,于是研究了一下listagg去重的几种方法,以下通过实例讲解三种实现listagg去重的方法。 二、方法 首先还原...

    一、简介

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

    展开全文
  • regexp_replace((listagg(OV.PNR, ',' ) within group (order by OV.PNR)), '([^,]+)(,\1)+', '\1') //https://blog.csdn.net/lx_manito/article/details/78489416 regexp_replace(listagg(t.class_key, ',') ...
    regexp_replace((listagg(OV.PNR, ',' ) within group (order by OV.PNR)), '([^,]+)(,\1)+', '\1')
    //https://blog.csdn.net/lx_manito/article/details/78489416
    
    
    regexp_replace(listagg(t.class_key, ',') within
                          group(order by t.class_key),
                          '([^,]+)(,\1)*(,|$)',
                          '\1\3')
    //https://blog.csdn.net/Weixiaohuai/article/details/84998212 
    

    以上为什么只提到listagg,其实对字符串“aa,aa,a,ab,ac”也有用,但是有一个限制,只对临近的字段可以做到去重,故多提到在listagg的去重中,因为listagg中可以排序。

    不能排序的,建议不用负责的sql解决,用java代码解决去重效率也会很快

    正则表达式解析:
    \1+ 表示重复上面捕获组里的内容一次或多次

    展开全文
  • Oracle listagg去重的两种方法

    千次阅读 2018-11-09 17:30:25
    一:SELECT DISTINCT  TYPE,  SUBTYPE,  LISTAGG (EN, ' | ')  WITHIN GROUP (ORDER BY EN)  OVER (PARTITION BY TYPE, SUBTYPE)  AS SKILLS  FROM (SELECT DIS...

    一:SELECT DISTINCT

           TYPE,

           SUBTYPE,

           LISTAGG (EN, ' | ')

              WITHIN GROUP (ORDER BY EN)

              OVER (PARTITION BY TYPE, SUBTYPE)

              AS SKILLS

      FROM (SELECT DISTINCT TYPE, SUBTYPE, EN

              FROM IKB

             WHERE SUBTYPE IN ('Technology_Database', 'test'))

    二:

     regexp_replace((listagg(OV.PNR, ',' ) within group (order by OV.PNR)), '([^,]+)(,\1)+', '\1')

     

     

     

    展开全文
  • listagg结果去重

    2021-03-03 21:11:55
    于是我就写了一个方法对listagg的结果去重,也可以对该格式的字符串去重,方法如下 create or replace function listaggpure(targetStr varchar2,seperator varchar2:=',') return varchar2 is Rslt varchar2...

    最近在一个项目中用到了listagg方法,但是在组合结果中出现有重复的情况。默认的结果如下

    于是我就写了一个方法对listagg的结果去重,也可以对该格式的字符串去重,方法如下

    create or replace function listaggpure(targetStr varchar2,seperator varchar2:=',')
    return  varchar2 is
      Rslt varchar2(32767);
    begin
      select listagg(str,seperator) within group (order by 1 asc) elist into Rslt
             from (select distinct regexp_substr(t1.targetstr,'[^'||seperator||']+',1,level) str
                          from (select targetStr from dual) t1
             connect by level<regexp_count(t1.targetstr,'[^'||seperator||']+',1)+1);
      return(Rslt);
    end listaggpure;

    使用该方法对listagg结果去重就达到了想要的效果了,如下图

    展开全文
  • oracle listagg() 去重

    万次阅读 2017-11-09 14:34:42
    oracle : regexp_replace((listagg(OV.PNR, ',' ) within group (order by OV.PNR)), '([^,]+)(,\1)+', '\1')
  • listagg 聚合函数及去重

    千次阅读 2018-08-01 16:28:34
    SELECT listagg(FOIDS,',') WITHIN GROUP(ORDER BY FOIDS) as allFos , listagg(RCIDS,',') WITHIN GROUP(ORDER BY RCIDS) as allRcs  FROM  (SELECT regexp_replace(listagg(FO.ID,',') WITHIN G...
  • select a.xxx, regexp_replace(listagg(b.area_proname,',') within group(order by b.area_proname),'([^,]+)(,\1)+', '\1') as area_proname from table_1a, table_2b where a.xx = b.xx ...
  • regexp_replace(listagg(m.appno, ',') within group(order by m.appno), '([^,]+)(,\1)+', '\1') as appno, regexp_replace(listagg(cg.deptid, ',') within group(order by cg.chargeseq), '([^,]+)...
  • Table of Contents 1. 原始数据 2. DB2 10.5及以前版本的实现 3.DB2 11.1及以后版本的表示方法 LISTAGG 函数用于将多个字符串元素,汇集...在DB2 11.1及之后的版本中,LISTAGG函数提供了使用DISTINCT关键值来支...
  • Oracle 子字符串去重 字符串长度不能过长(一般不超过 varchar2 的最大长度: 4000) 必须 排序(所以和 listagg() 比较契合) 原因: 相邻的子字符串才会做去重处理 SELECT regexp_replace(listagg('选择的列', ...
  • listagg函数拼接字符串后,去重 简单描述一下需求: 有一个员工基本信息表,因为部分员工的存在身兼数职位的情况,也就有多个部门,不同的部门的办公地点可能一样,也可能不一样。这个时候需要把同一个员工的部门...
  • 今天,在使用LISTAGG()函数连接不同角色所有人员的完整名称时,发现LISTAGG()函数本身并不提供去重的功能(相同的人名,在结果中会重复显示)。问问度娘,没有找到好用的解决方法。然后使用Yahoo英文版(Google要是...
  • 要实现的是去重按顺序分组拼接字段,且输出表中需要拼接多个字段。1、查了网上大概有四种方法,各有特点:1、wmsys.wm_concat(column)2、listagg (column,[,]) within group (order by ) [over (partition by )]3、...
  • 某字段内字符串去重

    千次阅读 2018-07-30 10:02:18
    与传统的数据去重不同,这是一个字段内的字符串有大量重复内容,需要去重 比如字段内容为:aa,bb,cc,dd,ab,aa,cc,dd 去重后的结果为:aa,bb,cc,dd,ab ...  LISTAGG(COLUMN_DISTINCT, ',') WITHIN GROUP(...
  • LISTAGG(列名,' 分割符号')oracle 11g 以上的版本才有的一个将指定列名的多行查询结果,用 指定的分割符号 合并成...license_id 数据进行分组,对 Item_Category_Name 列的数据进行 去重合并使用聚合函数 LISTAGG...
  • 因为业务需要对一些数据进行统计,需要对表涉及到的不同部门的进行过任务的用户id进行拼接之后到java代码中进行去重计数。 开始准备使用WM_CONCAT,放进去之后发现提示没有这个函数。 查了一下原来是因为这个...
  • 目标:根据type进行分组,把楼栋名去重后用"/"进行拼接 2.解决: 方案1:使用wm_concat select TYPE , wm_concat(NAME) NAME from T_BUILDING group by TYPE; wm_concat 默认使用的是逗号进行拼接,结果如下(此时...
  • [主要功能]将多行合并成一行 多行数据 实例:将多行数据合并成一行 如果想要在显示一列(如下错误写法) 【解决方法】没有分组条件,创建分组条件。 【去重】 ...
  • Distinct 去重 SELECT DISTINCT 列名称 FROM 表名称 oracle列转行 Listagg() 将查询到的 device_id 列转行: select listagg(device_id,',') within GROUP (order by device_id) from T_DEVICE where ...
  • 1、函数 select listagg(job,',') within GROUP (ORDER BY job) as 职位 FROM emp; listagg() within GROUP () 可以将多行合并成一行(比较常用) ...--循环取出每行中元素拼接(去重) declare job varchar(2000)...
  • 问题:Oracle中ORA-22922: 不存在的 LOB 值解决办法 个人问题点:WM_CONCAT(TO_CHAR(ORDER_NO)) ORDER_...注意:LISTAGG可能会存在重复值,注意去重。 注:Oracle官方并不推荐使用WM_CONCAT函数,因此尽量少用。 ...
  • Oracle 11g行字段拼接WMSYS.WM_CONCAT问题Not A LOB 一、问题出现 项目中的某个查询需要将表中某个字段不重复地拼接起来,百度...但由于listagg不能直接在参数中使用distinct去重,因此采用WM_CONCAT函数。 SQL格式...
  • Oracle一列的多行数据拼成一行显示字符 ...该函数是去重之后,才拼成一行的。 如: SELECT replace(WMSYS.WM_CONCAT(a.PHONE),’,’,’;’) from PHONE a; 2.oracle提供的函数ListAgg,语法格式: LISTAGG( [,]) WI

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

listagg去重