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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章