Oracle 合併行數據,利用分析函數而非wm_concat()函數

一般合併行數據都使用 wm_concat() 函數,有最大的大小限制(最大是4000長度)

首先了解分析函數
  1. ,它和聚合函數的不同之處是對於每個組返回多行,而聚合函數對於每個組只返回一行。
  2. 利用分析函數,例如這些,可以實現合併行的數據,並且效率高

使用分組函數進行合併行數據,效率高,而且長度不受限制(忘了從哪裏學習來的了…)

  • 表結構如下
    在這裏插入圖片描述
-- SQL如下
SELECT VC_DEPT,TRANSLATE(LTRIM(TEXT,','),'*/','*\\\n') RESULT FROM(
SELECT ROW_NUMBER() OVER(PARTITION BY VC_DEPT ORDER BY VC_DEPT,LVL DESC) RN, VC_DEPT, TEXT FROM(
SELECT VC_DEPT, LEVEL LVL,SYS_CONNECT_BY_PATH(VC_NAME,',') TEXT FROM(
       SELECT VC_DEPT,VC_NAME, ROW_NUMBER() OVER(PARTITION BY VC_DEPT ORDER BY VC_NAME,VC_DEPT) X FROM AAA_TEST_DEPT
) A CONNECT BY VC_DEPT = PRIOR VC_DEPT AND X-1 = PRIOR X
)
) WHERE RN = 1 ORDER BY VC_DEPT
  • 查詢結果如下
    在這裏插入圖片描述

其他分析函數的使用 例:

1. 使用 row_number() over(partition by … order by …) 分組排序

在這裏插入圖片描述
rank() over(partition by … order by …)
dense_rank() over(partition by … order by …)
row_number(),rank(), dense_rank() 的區別 鏈接

2. 使用COUNT() OVER(PARTITION BY … ORDER BY…)

在這裏插入圖片描述
count() over(partition by … order by …)
其他類似:
max() over(partition by … order by …)
min() over(partition by … order by …)
sum() over(partition by … order by …)
avg() over(partition by … order by …)

3. 使用first_value() over(partition by … order by …)在這裏插入圖片描述

first_value() over(partition by … order by …)
last_value() over(partition by … order by …)
first_value(),last_value()詳解 鏈接

4.使用LAG() OVER(PARTITION BY … ORDER BY …) 分組排序

在這裏插入圖片描述
lag() over(partition by … order by …)
lead() over(partition by … order by …)
lag(),lead()詳解 鏈接

發佈了42 篇原創文章 · 獲贊 29 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章