Oracle?listagg去重distinct的三種方式總結(jié)
一、簡(jiǎn)介
最近在工作中,在寫(xiě)oracle統(tǒng)計(jì)查詢(xún)的時(shí)候,遇到listagg聚合函數(shù)分組聚合之后出現(xiàn)很多重復(fù)數(shù)據(jù)的問(wèn)題,于是研究了一下listagg去重的幾種方法
以下通過(guò)實(shí)例講解三種實(shí)現(xiàn)listagg去重的方法。
二、方法
首先還原listagg聚合之后出現(xiàn)重復(fù)數(shù)據(jù)的現(xiàn)象,打開(kāi)plsql,執(zhí)行如下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
運(yùn)行結(jié)果:
如圖,listagg聚合之后很多重復(fù)數(shù)據(jù),下面講解如何解決重復(fù)數(shù)據(jù)問(wèn)題。
【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聚合之后沒(méi)有出現(xiàn)重復(fù)數(shù)據(jù)了。oracle官方不太推薦使用wm_concat()來(lái)進(jìn)行聚合,能盡量使用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去重問(wèn)題如果拼接的字符串太長(zhǎng)會(huì)報(bào)oracle超過(guò)最大長(zhǎng)度的錯(cuò)誤,只適用于數(shù)據(jù)量比較小的場(chǎng)景。
【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;
推薦使用這種方式,先把重復(fù)數(shù)據(jù)去重之后再進(jìn)行聚合處理。
三、總結(jié)
以上就是關(guān)于listagg聚合函數(shù)去重的三種處理方法的總結(jié),本文僅僅是筆者的一些總結(jié)和見(jiàn)解,僅供大家學(xué)習(xí)參考,希望能對(duì)大家有所幫助。也希望大家多多支持腳本之家。
相關(guān)文章
PL/SQL Developer連接64位的Oracle圖文教程
這篇文章主要為大家詳細(xì)介紹了PL/SQL Developer連接64位的Oracle圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Oracle 12.2處理sysaux空間占滿(mǎn)問(wèn)題
今天處理別的問(wèn)題查看告警日志偶然發(fā)現(xiàn)大量的報(bào)錯(cuò),無(wú)法擴(kuò)展SYSAUX表空間,于是登錄系統(tǒng),查看系統(tǒng)表空間使用情況,發(fā)現(xiàn)SYSAUX表空間用滿(mǎn)了,所以本文給大家介紹了Oracle 12.2處理sysaux空間占滿(mǎn)問(wèn)題,需要的朋友可以參考下2024-02-02oracle11g 通過(guò)修改配置文件方式連接遠(yuǎn)程數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了oracle11g 通過(guò)修改配置文件方式連接遠(yuǎn)程數(shù)據(jù)庫(kù)的方法,需要的朋友可以參考下2017-04-04修改計(jì)算機(jī)名或IP后Oracle10g服務(wù)無(wú)法啟動(dòng)的解決方法
修改計(jì)算機(jī)名或IP后Oracle10g無(wú)法啟動(dòng)服務(wù)即windows服務(wù)中有一項(xiàng)oracle服務(wù)啟動(dòng)不了,報(bào)錯(cuò),下面是具體的解決方法2014-01-01ORA-00349|激活 ADG 備庫(kù)時(shí)遇到的問(wèn)題及處理方法
這篇文章主要介紹了ORA-00349|激活 ADG 備庫(kù)時(shí)遇到的問(wèn)題及處理方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Oracle查詢(xún)sql錯(cuò)誤信息的控制和定位
今天小編就為大家分享一篇關(guān)于Oracle查詢(xún)sql錯(cuò)誤信息的控制和定位,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12Oracle遞歸樹(shù)形結(jié)構(gòu)查詢(xún)功能
oracle樹(shù)狀結(jié)構(gòu)查詢(xún)即層次遞歸查詢(xún),是sql語(yǔ)句經(jīng)常用到的,在實(shí)際開(kāi)發(fā)中組織結(jié)構(gòu)實(shí)現(xiàn)及其層次化實(shí)現(xiàn)功能也是經(jīng)常遇到的。這篇文章給大家介紹了Oracle遞歸樹(shù)形結(jié)構(gòu)查詢(xún)功能,需要的朋友參考下2019-09-09