網站首頁 編程語言 正文
一、簡介
最近在工作中,在寫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;
推薦使用這種方式,先把重復數據去重之后再進行聚合處理。
三、總結
原文鏈接:https://weishihuai.blog.csdn.net/article/details/84998212
相關推薦
- 2022-02-18 連接redis服務器提示:Redis Client On Error: Error: connect
- 2023-10-10 Promise同時獲取n個接口數據的幾種方式
- 2022-05-18 C/C++實現segy文件的讀取詳解_C 語言
- 2023-02-23 golang?int64轉int的方法_Golang
- 2023-03-26 C#連接藍牙設備的實現示例_C#教程
- 2022-04-05 python中時間轉換錯誤:時間戳轉換|帶有時區的轉換 如何解析ISO 8601格式的日期?
- 2023-12-15 log4j.properties自定義日志配置
- 2022-09-16 C#數據庫操作的示例詳解_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支