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)相关推荐

  1. mysql去重函数的使用方法_MySQL中使用去重distinct方法的示例详解

    一 distinct 含义:distinct用来查询不重复记录的条数,即distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而 ...

  2. 记录一个db2 中LISTAGG函数问题:The length resulting from “LISTAGG“ is greater than “4000“

    记录一个db2 中LISTAGG函数问题 什么是LISTAGG函数 LISTAGG("字段名","分隔符") as "自定义字段名" 就是将 ...

  3. oracle数据库listagg,Oracle 19c 中的 LISTAGG 函数结果去重

    Oracle 11gR2 中引入了 LISTAGG 函数,以简化字符串聚合.在Oracle 12cR2中,它已扩展为包括溢出错误处理.Oracle 19c 中通过包含 DISTINCT 关键字,可以从 ...

  4. mysql中去重的用法_mysql中去重 distinct 用法

    在使用MySQL时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count( ...

  5. java中sql查重跟去重_SQL去重distinct方法解析

    关注我的公众号获取自动化视频教程:搬砖的小测试 链接:https://pan.baidu.com/s/1ZXiWrytBLY4osCW6-d_-vQ 提取码:在公众号回复获取 一 distinct 含 ...

  6. Oracle 中 LISTAGG 函数的介绍以及使用

    LISTAGG 函数介绍 listagg 函数是 Oracle 11.2 推出的新特性. 其主要功能类似于 wmsys.wm_concat 函数, 即将数据分组后, 把指定列的数据再通过指定符号合并. ...

  7. python内置函数可以返回列表元组_Python内置函数()可以返回列表、元组、字典、集合、字符串以及range对象中元素个数....

    Python内置函数()可以返回列表.元组.字典.集合.字符串以及range对象中元素个数. 青岛远洋运输有限公司冷聚吉船长被评为全国十佳海员.()A:错B:对 有源逆变是将直流电逆变成其它频率的交流 ...

  8. 函数中参数有数组时注意的小问题(不一定要传递数组长度,不用返回数组,可以在函数中改变数组元素值)

    函数中参数有数组时注意的小问题: 1.不一定要传递数组长度 2.不用返回数组,可以在函数中改变数组元素值 通过下面这个小例子来验证: #include<iostream> #include ...

  9. Python之pandas:pandas中数据处理常用函数(与空值相关/去重和替代)简介、具体案例、使用方法之详细攻略

    Python之pandas:pandas中数据处理常用函数(与空值相关/去重和替代)简介.具体案例.使用方法之详细攻略 目录 pandas中数据处理常用函数(isnull/dropna/fillna/ ...

最新文章

  1. SecureCRT中sqlplus,使用Backspace删除时 ^H^H
  2. B-Tree索引在sqlserver和mysql中的应用
  3. 从自我学习到深层网络
  4. 英伟达联合芯片巨头ARM打造IOT设备的AI芯片
  5. 登录后 可编辑页面 php,如何查找和编辑登录的php页面以及更改详细信息 - WordPress - srcmini...
  6. javascript 容错处理代码(屏蔽js错误)
  7. Float,Double单双精度在线转换成二进制
  8. HTML5 Canvas(画布)
  9. Python 爬虫 —— 使用 pandas
  10. 《Ray Tracing from the Ground Up》中的坐标系是怎么确定的
  11. 理解数据类型与数学运算:摄氏温度与华氏温度的相互转换
  12. paip.提升用户体验与安全性---注册流程总结
  13. nginx+lua_nginx+GraphicsMagick生成实时缩略图
  14. 这可能是最全的JAVA入门教程 ~
  15. 【安卓学习之第三方库】 消息推送之阿里云推送
  16. 读书笔记:《产品经理手册》(第4版)
  17. 盘点2011年各月影响云计算发展的大事件
  18. 联想拯救者15ISK更换NVEM2.0三星SSD980过程实操
  19. Ad hoc网络路由协议概述4——按需路由协议(2)AODV协议 (Ad-hoc on-demand distance vector algorithm protocol)
  20. 新麦机械冲刺深交所:年营收9.7亿 谢氏家族持股23%

热门文章

  1. java 框架漏洞网站_在分层架构下寻找java web漏洞
  2. C语言实现一个列表式的学生信息管理系统(完善)
  3. Violence detection-Hockey Fight-CNN+LSTM暴力检测CNN+LSTM实例
  4. 关于Vue移动端框架(Muse-UI)的使用(说明书,针对不愿看文档的童鞋)
  5. 重庆大学计算机测控应用基础,重庆大学201803批次网上计算机应用基础B卷
  6. Linux下EAGAIN宏的含义
  7. 低温烧结银--功率半导体器件封装的幕后英雄
  8. 前端 mock 数据及工具介绍
  9. cg 201909-1
  10. 如何SCP从服务器远程下载文件到本地