【DB2】LISTAGG函数中元素的去重(DISTINCT)
Table of Contents
1. 原始数据
2. DB2 10.5及以前版本的实现
3. DB2 11.1及以后版本的表示方法
LISTAGG 函数用于将多个字符串元素,汇集成一个大的字符串,可以将这些字符串元素以某个分隔符隔开。而常常需要考虑在汇集成大的字符串时,去除那些重复的字符串元素。
在DB2 11.1及之后的版本中,LISTAGG函数提供了使用DISTINCT关键值来支持这种情况,参考网页:https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0058709.html。
而在DB2 10.5及之前的版本,LISTAGG函数还不能支持DISTINCT的处理,参考网页:https://www.ibm.com/support/knowledgecenter/en/SSEPGG_10.5.0/com.ibm.db2.luw.sql.ref.doc/doc/r0058709.html。
这里先给出在DB2 10.5及之前版本的实现方法,然后再用DB2 11.1及之后版本中的DISTINCT形式来实现。
1. 原始数据
首先看示例的原始数据:
SELECT *
FROM (VALUES (10,'PRESIDENT'),(30,'MANAGER'),(10,'PRESIDENT'),(20,'ANALYST'),(30,'CLERK'),(20,'MANAGER'),(20,'CLERK'),(10,'MANAGER'),(30,'SALESMAN')) AS emp(deptno,job)
ORDER BY deptno, job
WITH ur;
DEPTNO|JOB
------|---------10|MANAGER 10|PRESIDENT10|PRESIDENT20|ANALYST 20|CLERK 20|MANAGER 30|CLERK 30|MANAGER 30|SALESMAN
2. DB2 10.5及以前版本的实现
现在将deptno作为主键来做汇集,同一个deptno的所有job经过LISTAGG函数汇集成一个大的字符串,去除其中重复的元素:
WITH emp(deptno,job) AS(SELECT *FROM (VALUES (10,'PRESIDENT'),(30,'MANAGER'),(10,'PRESIDENT'),(20,'ANALYST'),(30,'CLERK'),(20,'MANAGER'),(20,'CLERK'),(10,'MANAGER'),(30,'SALESMAN'))
),fld(deptno, job) AS(SELECT deptno,DECODE(ROW_NUMBER () OVER (PARTITION BY deptno,job), 1, job) jobFROM emp
)
SELECT deptno,LISTAGG(job, ',') WITHIN GROUP (ORDER BY job DESC) jobs
FROM fld
GROUP BY deptno
WITH ur;
DEPTNO|JOBS
------|----------------------10|PRESIDENT,MANAGER 20|MANAGER,CLERK,ANALYST 30|SALESMAN,MANAGER,CLERK
此方法使用DECODE函数和ROW_NUMBER窗口表达式相结合实现了去重。而后面的的LISTAGG会实现这些元素的排序,这里是倒序。下面再来看看两个字段的情况:
WITH emp(deptno,job) AS(SELECT *FROM (VALUES (10,'PRESIDENT'),(30,'MANAGER'),(10,'PRESIDENT'),(20,'ANALYST'),(30,'CLERK'),(20,'MANAGER'),(20,'CLERK'),(10,'MANAGER'),(30,'SALESMAN'))
),fld(deptno, job) AS(SELECT DECODE(ROW_NUMBER () OVER (PARTITION BY deptno), 1, deptno) deptno,DECODE(ROW_NUMBER () OVER (PARTITION BY job), 1, job) jobFROM emp
)
SELECT LISTAGG(deptno, ',') WITHIN GROUP (ORDER BY deptno) deptnos,LISTAGG(job, ',') WITHIN GROUP (ORDER BY job DESC) jobs
FROM fld
WITH ur;
DEPTNOS |JOBS
--------|----------------------------------------
10,20,30|SALESMAN,PRESIDENT,MANAGER,CLERK,ANALYST
3. DB2 11.1及以后版本的表示方法
如果使用了DB2 11.1及以后版本的DISTINCT 表达式,则实现非常简单。
WITH emp(deptno,job) AS(SELECT *FROM (VALUES (10,'PRESIDENT'),(30,'MANAGER'),(10,'PRESIDENT'),(20,'ANALYST'),(30,'CLERK'),(20,'MANAGER'),(20,'CLERK'),(10,'MANAGER'),(30,'SALESMAN'))
)
SELECT deptno, LISTAGG(DISTINCT job, ',') WITHIN GROUP (ORDER BY job DESC) jobs
FROM emp
GROUP BY deptno
WITH ur;
DEPTNO|JOBS
------|----------------------10|PRESIDENT,MANAGER 20|MANAGER,CLERK,ANALYST 30|SALESMAN,MANAGER,CLERK
然后是两个字段同时处理的情况:
WITH emp(deptno,job) AS(SELECT *FROM (VALUES (10,'PRESIDENT'),(30,'MANAGER'),(10,'PRESIDENT'),(20,'ANALYST'),(30,'CLERK'),(20,'MANAGER'),(20,'CLERK'),(10,'MANAGER'),(30,'SALESMAN'))
)
SELECT LISTAGG(DISTINCT deptno, ',') deptnos,LISTAGG(DISTINCT job, ',') WITHIN GROUP (ORDER BY job DESC) jobs
FROM emp
WITH ur;
DEPTNOS |JOBS
--------|----------------------------------------
10,20,30|SALESMAN,PRESIDENT,MANAGER,CLERK,ANALYST
【DB2】LISTAGG函数中元素的去重(DISTINCT)相关推荐
- mysql去重函数的使用方法_MySQL中使用去重distinct方法的示例详解
一 distinct 含义:distinct用来查询不重复记录的条数,即distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而 ...
- 记录一个db2 中LISTAGG函数问题:The length resulting from “LISTAGG“ is greater than “4000“
记录一个db2 中LISTAGG函数问题 什么是LISTAGG函数 LISTAGG("字段名","分隔符") as "自定义字段名" 就是将 ...
- oracle数据库listagg,Oracle 19c 中的 LISTAGG 函数结果去重
Oracle 11gR2 中引入了 LISTAGG 函数,以简化字符串聚合.在Oracle 12cR2中,它已扩展为包括溢出错误处理.Oracle 19c 中通过包含 DISTINCT 关键字,可以从 ...
- mysql中去重的用法_mysql中去重 distinct 用法
在使用MySQL时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count( ...
- java中sql查重跟去重_SQL去重distinct方法解析
关注我的公众号获取自动化视频教程:搬砖的小测试 链接:https://pan.baidu.com/s/1ZXiWrytBLY4osCW6-d_-vQ 提取码:在公众号回复获取 一 distinct 含 ...
- Oracle 中 LISTAGG 函数的介绍以及使用
LISTAGG 函数介绍 listagg 函数是 Oracle 11.2 推出的新特性. 其主要功能类似于 wmsys.wm_concat 函数, 即将数据分组后, 把指定列的数据再通过指定符号合并. ...
- python内置函数可以返回列表元组_Python内置函数()可以返回列表、元组、字典、集合、字符串以及range对象中元素个数....
Python内置函数()可以返回列表.元组.字典.集合.字符串以及range对象中元素个数. 青岛远洋运输有限公司冷聚吉船长被评为全国十佳海员.()A:错B:对 有源逆变是将直流电逆变成其它频率的交流 ...
- 函数中参数有数组时注意的小问题(不一定要传递数组长度,不用返回数组,可以在函数中改变数组元素值)
函数中参数有数组时注意的小问题: 1.不一定要传递数组长度 2.不用返回数组,可以在函数中改变数组元素值 通过下面这个小例子来验证: #include<iostream> #include ...
- Python之pandas:pandas中数据处理常用函数(与空值相关/去重和替代)简介、具体案例、使用方法之详细攻略
Python之pandas:pandas中数据处理常用函数(与空值相关/去重和替代)简介.具体案例.使用方法之详细攻略 目录 pandas中数据处理常用函数(isnull/dropna/fillna/ ...
最新文章
- SecureCRT中sqlplus,使用Backspace删除时 ^H^H
- B-Tree索引在sqlserver和mysql中的应用
- 从自我学习到深层网络
- 英伟达联合芯片巨头ARM打造IOT设备的AI芯片
- 登录后 可编辑页面 php,如何查找和编辑登录的php页面以及更改详细信息 - WordPress - srcmini...
- javascript 容错处理代码(屏蔽js错误)
- Float,Double单双精度在线转换成二进制
- HTML5 Canvas(画布)
- Python 爬虫 —— 使用 pandas
- 《Ray Tracing from the Ground Up》中的坐标系是怎么确定的
- 理解数据类型与数学运算:摄氏温度与华氏温度的相互转换
- paip.提升用户体验与安全性---注册流程总结
- nginx+lua_nginx+GraphicsMagick生成实时缩略图
- 这可能是最全的JAVA入门教程 ~
- 【安卓学习之第三方库】 消息推送之阿里云推送
- 读书笔记:《产品经理手册》(第4版)
- 盘点2011年各月影响云计算发展的大事件
- 联想拯救者15ISK更换NVEM2.0三星SSD980过程实操
- Ad hoc网络路由协议概述4——按需路由协议(2)AODV协议 (Ad-hoc on-demand distance vector algorithm protocol)
- 新麦机械冲刺深交所:年营收9.7亿 谢氏家族持股23%
热门文章
- java 框架漏洞网站_在分层架构下寻找java web漏洞
- C语言实现一个列表式的学生信息管理系统(完善)
- Violence detection-Hockey Fight-CNN+LSTM暴力检测CNN+LSTM实例
- 关于Vue移动端框架(Muse-UI)的使用(说明书,针对不愿看文档的童鞋)
- 重庆大学计算机测控应用基础,重庆大学201803批次网上计算机应用基础B卷
- Linux下EAGAIN宏的含义
- 低温烧结银--功率半导体器件封装的幕后英雄
- 前端 mock 数据及工具介绍
- cg 201909-1
- 如何SCP从服务器远程下载文件到本地