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

2023-11-04

一、简介

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

以下通过实例讲解三种实现listagg去重的方法。

二、方法

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

1

2

3

4

5

6

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去重聚合

1

2

3

4

5

6

7

--第一种方法: 使用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字符串大小比较小的情况)

1

2

3

4

5

6

7

8

9

--第二种方法:使用正则替换方式去重(仅适用于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】第三种方法

先去重,再聚合(推荐使用)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

--第三种方法:先去重,再聚合

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;

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle listagg去重distinct的三种方式总结 的相关文章

  • 如何持续交付基于SQL的应用程序?

    我希望将持续交付概念应用到我们正在构建的 Web 应用程序中 并想知道是否有任何解决方案可以保护数据库免受意外错误提交的影响 例如 删除整个表而不是单个记录的错误 根据持续交付原则 如何限制这个问题的影响 即应用程序逐渐部署在基础设施的各个
  • 我应该对表进行分区/子分区吗?

    Case 系统有dispositives 基本上由id type name 我可能有N个dispositives 我有一张桌子来存放log of all dispositives 这是系统中最大的表 现在统计100英里记录 The log表
  • 如何编写一个简单的版本控制系统?

    我想做一个简单的版本控制系统 但我不知道如何构建我的数据和代码 这是一个简短的例子 用户登录 User has two options when uploading a file 提交新文件 提交文件的新版本 用户应该能够看到树 版本不同
  • 添加日期时间和时间

    服务器 SQL Server 2012 SP1 开发者版 Code declare datetime datetime 1900 01 01 00 00 00 000 declare time time 11 11 11 select da
  • 如何查看所有者是否有权在 Oracle 中执行存储过程

    我需要验证我的所有者是否有权执行存储过程 但我必须在 sys 表上进行搜索 我可以在哪个表中找到它 谢谢你 与它的名称相反 DBA TAB PRIVS 允许我们查看所有对象的授予权限 而不仅仅是表 select from DBA TAB P
  • 带可选参数的 SQL 更新命令?

    我将大约 500 000 个对象插入数据库 其中许多对象是相同的 在数据库中具有相同的主键表示 但其他字段可能不同 因此我使用方法 更新 如果没有行受影响 插入 问题是 有时一个对象的某些字段设置为 null 从文件中无法读取 并且已经在数
  • ssis将N个表从源服务器加载到目标服务器的最佳实践

    我需要将 N 个 大约 50 个 表从源数据库加载到目标数据库 每个表都与其他表不同 因此元数据不同 我想我可以使用父 pkg 来调用子 pkg 其中每个子 pkg 都有简单的结构 例如 DFT 来映射要导入的表 1 个子 pkg gt 1
  • 查找缺失值

    我有一个表 有 2 个重要的列 DocEntry WebId 样本数据就像 DocEntry WebId 1 S001 2 S002 3 S003 4 S005 现在我们可以注意到 在 WebId 列中 S004 丢失了 我们如何通过查询找
  • PDO 和 Microsoft SQL:必须声明表变量“@P1”

    我正在尝试使用 PDO 中的绑定从 Microsoft SQL 数据库中选择一些条目 我正在使用的代码看起来与我在文档中找到的代码类似 但是 当我运行它时 我收到以下警告 警告 PDOStatement execute pdostateme
  • 在两个以上的表上使用内联接删除查询

    我想使用两个以上表上的内联接从表中删除记录 假设我有表 A B C D 其中 A 的 pk 在所有其他提到的表中共享 然后如何编写删除查询以使用表 B 和 A 上的内联接从表 D 中删除记录 因为条件是从这两个表中获取的 我需要从 DB2
  • 在 JSP 中迭代列表对象

    我正在做一个项目来尝试自学 spring 和 struts 我目前卡在 JSP 页面上 我有一个 pojo 类 其中包含带有 getter setter 的变量 eid 和 ename 我还有一个 sql 中的表 其具有相同的值和六个填充行
  • 使用存储过程访问数据可以提供哪些安全优势?

    我看到一些指南建议您通过存储过程对所有数据访问进行分层来保护数据库 我知道对于 SQL Server 您可以保护表甚至列免受 CRUD 操作的影响 例如 Logged in as sa USE AdventureWorks GRANT SE
  • 将 SQL 中的数据存储在数组中

    我正在尝试将 sql 数据库中的数据存储到数组中 目前我有这个 query mysql query SELECT FROM InspEmail WHERE Company LIKE company while row mysql fetch
  • WHERE 子句或 ON 子句中的 INNER JOIN 条件?

    我今天输错了一个查询 但它仍然有效并给出了预期的结果 我的意思是运行这个查询 SELECT e id FROM employees e JOIN users u ON u email e email WHERE u id 139840 但我
  • 左连接,左表中没有重复行

    请看下面的查询 tbl 目录 Content Id Content Title Content Text 10002 New case Study New case Study 10003 New case Study New case S
  • 如何在 SQL 中编写 where 子句来按一天中的时间过滤 DATETIME 列?

    我有带有 DATETIME 列时间戳的数据 我想将其过滤到 DATETIME 介于上午 9 30 到下午 5 30 之间的任意一天的记录集 最好的方法是什么 更新 更改是因为我需要精确到分钟 而不仅仅是小时 对于那个很抱歉 您始终可以将其编
  • 获取 SQL 表上未使用的唯一值

    我有一个表 其中有一列描述数字 ID 该 ID 对于所有行都是唯一的 但它不是主键 数字 ID 是有限的 假设答案可以是从 1 到 10 SELECT ID FROM TABLE ID 1 2 5 我必须 通过 UI 向用户呈现未使用的值
  • 在带有循环引用的表中插入 SQL

    我有 2 张桌子 Empleados numEmpl nombre apellido sexo telefono salario numDept Departamentos numDept nombreDept numDirect 在部门中
  • 我的数据库有错误

    创建表时如下 create table Ticket ticket id integer not null primary key AirlineName varchar not null CustomerName varchar from
  • SQL Server XQuery 返回错误

    我正在 SQL Server 2012 中对 XML 数据类型列执行查询 数据示例如下

随机推荐

  • 【MySQL修改及删除操作】

    DML修改数据 前面呢给大家分享了添加数据的操作 今天就跟大家分享一下修改操作 小阿婆前面有说到DML是关于数据的操作 那么修改数据则用到了update关键字 我就不过多赘述啦 修改表中数据 update t student set sex
  • 主成分分析PCA,(主成分分析经常用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特征)

    I 清空环境变量 PCA BP I 清空环境变量 clear all clc 导入数据 X xlsread inputd PCA主成分降维 Z MU SIGMA zscore X 计算相关系数矩阵 Sx cov Z 相关系数矩阵计算 计算相
  • 养老院人员定位手环真的如此智能?老人定位手环当然很智能-新导智能

    养老院人员定位手环为 新冠疫情 患者 护理院和养老院等老人和特别人员等在现有的基础上去掉心率 增加手臂体表温度检测 丈量1分钟 24小时能够自在调整 并经过低功耗NB IoT网络上签到后台 也能够外界蓝牙温度计 血糖仪或其他外设 上签到后台
  • 【Qt】qml TreeView的简单使用

    主要参考了官方demo Simple Tree Model Example 借鉴了https blog csdn net shado walker article details 56495059中roleNames 函数的写法 由于官方的
  • Flink简单教学2-本地安装和运行

    下载安装包 访问官网 下载最新版本 本教程使用Flink1 9版本 目录说明 bin flink 启动的脚本文件 lib flink 运行时jar包依赖 conf flink 启动的配置 如web端口 日志配置等 example flink
  • 小米笔记本装centos无法连接wifi问题

    1 打开终端 2 打开wifi nmcli r wifi on 3 搜索wifi nmcli dev wifi 4 连接wifi nmcli d wifi connect wifi名字 password 密码 网卡名 不知道wifi网卡名称
  • 浏览器原理+跨域+解决方案

    原网址 浏览器部分笔记 浏览器不同窗口cookie共享吗 JackieChan 的博客 CSDN博客 一 浏览器存储对象 1 cookie cookie是一种纯文本文件 大小只有4kb 每次发送非跨域html请求时都会自动携带 特性如下 c
  • java基础: Date类型最常用的时间计算(相当全面)

    目录 1 前言 2 具体方法实现 2 1 获取当天的开始时间 2 2 获取当天的结束时间 2 3 获取昨天的开始时间 2 4 获取昨天的结束时间 2 5 获取明天的开始时间 2 6 获取明天的结束时间 2 7 获取本周的开始时间 2 8 获
  • [echarts]clear和dispose的区别和使用场景

    clear和dispose是echarts提供的用于解决内存溢出的方法 内存溢出 当程序运行时需要的内存超出了当前应用系统的剩余内存时 就造成了内存溢出的情况 直观表现就是 卡死 所以只要使用echarts了 最好都clear或dispos
  • 工具使用(kali linux 中 nmap msf cs docker Goby)

    docker nmap MSF CS Goby docker 一 前言 其实我个人不常使用docker 到目前为止也只是搞了个xss靶场 在这里主要是先总结总结 以后用到也就方便了 主要分为两部分 一个是docker常用的一些连招操作 希望
  • DevExpress控件显示弹出注册对话框的应对方法

    删除Properties下的license licx 目前来看是可以的
  • 记一次从日立G400划一个LUN给dg数据库

    从日立G400划一个1T的lun 映像路径给DG主机 cat proc scsi scsi 为不重启主机识别设备 echo gt sys class scsi host host1 scan echo gt sys class scsi h
  • 等保合规2022系列

    2022等保合规指南 第一篇 四个核心问答 帮你读懂 等保 等级保护制度在我国已经推广了近20年了 如下图 从等保制度的逐渐成熟 到整个制度被上升到法律高度 无一不证明了网络安全是我国网络强国战略的重要组成部分 而网络安全等级保护是落实网络
  • STM32启动文件分析(startup_stm32f10x_md.s)

    初始化堆栈 初始化栈指针 SP 初始化栈指针 SP 向量表的设置 配置系统时钟进入main 一般而言 系统上电后第一个执行的是由汇编所编写的启动文件 其主要工作为一下五部分 初始化堆栈指针SP initial sp 初始化PC指针 令其 R
  • 逻辑漏洞之越权、支付漏洞

    目录 逻辑漏洞 Web安全渗透三大核心方向 输入输出 登录体系 权限认证 业务逻辑漏洞分类 1 登录体系安全 暴力破解 cookie安全 加密测试 登录验证绕过 任意注册 2 业务一致性安全 手机号篡改 邮箱和用户名更改 订单ID更改 商品
  • Linux操作系统入门

    Linux操作系统入门 一 入门概述 我们为什么要学习Linux linux诞生了这么多年 以前还喊着如何能取代windows系统 现在这个口号已经小多了 任何事物发展都有其局限性都有其天花板 就如同在国内再搞一个社交软件取代腾讯一样 想想
  • Hadoop3x高可用集群配置手册

    集群规划 本次安装拟使用的各软件版本如下 CentOS 7 6 Zookeeper 3 6 3 Hadoop 3 2 2 Hive 3 1 2 Spark 3 0 2 Sqoop 1 4 7 MySQL 8 0 21 机器规划 机器名称 z
  • CentOS7下python开发环境配置

    https blog csdn net nicomy2018 article details 78617976 configure prefix usr local
  • 内网DNS域名解析 blocky服务

    此片文章为DNS内网解析部署文档 简单实用 解决企业内部web服务IP地址访问问题 企业内部如果不启用域名DNS服务 服务器就只能通过IP进行访问了 除了传统的bind解决方案 推荐一个新的DNS解决方案 blocky blocky 的Gi
  • Oracle listagg去重distinct的三种方式总结

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