国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Oracle listagg去重distinct的三種方式總結

瀏覽:215日期:2023-03-12 15:25:40
目錄
  • 一、簡介
  • 二、方法
    • 【a】 第一種方法
    • 【b】第二種方法
    • 【c】第三種方法
  • 三、總結

    一、簡介

    最近在工作中,在寫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; 

    推薦使用這種方式,先把重復數據去重之后再進行聚合處理。

    三、總結

    以上就是關于listagg聚合函數去重的三種處理方法的總結,本文僅僅是筆者的一些總結和見解,僅供大家學習參考,希望能對大家有所幫助。也希望大家多多支持。

    標簽: Oracle
    主站蜘蛛池模板: 日本在线观看免费看片 | 亚洲精品一区二区三区五区 | 国产大片线上免费观看 | 九九国产在线视频 | 写真片福利视频在线播放 | 久久国产精品视频一区 | 国产成人免费视频精品一区二区 | 欧美成人艳星在线播放 | 国产精品伦理久久久久 | 国产美女做爰免费视频软件 | 日韩欧美视频一区 | 97久久草草超级碰碰碰 | 国产麻豆福利a v在线播放 | 在线视频免费观看a毛片 | 正在播放国产精品放孕妇 | 免费一级a毛片在线播 | 久久久久久亚洲精品不卡 | 自拍视频第一页 | 动漫精品一区二区 | 亚洲成aⅴ人片在线影院八 亚洲成av人片在线观看 | 亚洲精品国产成人专区 | 久草首页在线观看 | 很黄很色的免费视频 | 嫩草一区二区三区四区乱码 | 色噜噜狠狠大色综合 | 国内精品国语自产拍在线观看55 | 99久久免费国产精精品 | 亚洲夜色 | 国产区一区二 | 欧美一级久久久久久久久大 | 碰碰久久 | 精品在线一区二区三区 | 成人欧美在线视频 | 国内自拍偷拍视频 | 成人在线观看一区 | 日本 欧美 国产 | 和老外3p爽粗大免费视频 | 国产精品久久久久久一区二区三区 | 国产看色免费 | 三级网站在线 | 另类自拍 |