oracle聚合函式彙總

2021-09-02 21:28:40 字數 2775 閱讀 7974

今天在做專案,講mysql專案轉換為oracle專案的時候,發現某些sql語句不相容

mysql語句如下

select

column1,

group_concat(shouyilv order by crete_date) as shouyilv

from

rconfigdata

where

column2 = '1'

group by

column1

order by

column1

發現上面語句在oracle下不識別group_concat函式,因此需要進行轉換,轉換語句如下

select

column1,listagg(shouyilv,',') within group(order by crete_date) as shouyilv

from

rconfigdata

where

column2 = '1'

group by

column1

order by

column1

該方法來自wmsys下的wm_concat函式,屬於oracle內部函式,返回值型別varchar2,最大字元數4000。隨著版本的變更返回值型別可能會有改動,專案中使用時候最好在新的使用者下建立乙個函式。

使用方法:

select deptno,wm_concat(ename) from emp group by deptno;

排序方法(未必僅此一種寫法):

select *

from (select wm_concat(ename) over(partition by deptno order by empno) val,

row_number() over(partition by deptno order by empno desc) rn,

a.*from emp a)

where rn = 1;

如果僅是簡單聚合資料,可以使用該函式,

優點:效率高。

缺點:(1)、返回最大字元數4000;

(2)、行資料預設以逗號分隔,可以修改函式更改,但是函式一旦建立不能隨意自定義分隔符;

(3)、排序實現複雜且效率低;

(4)、內部聚合混亂。比如:

select wm_concat(col1) col3,wm_concat(col2) col4 from tab;

返回的col3和col4裡的聚合資料未必是一一對應的。

該函式是在wm_concat基礎上修改返回值型別得到,可以返回clob型別資料,內部實現同wm_concat。優缺點同wm_concat。

11g新增函式,返回值varchar2,同樣受4000字元數限制。但是可以排序,可以指定分隔符。

使用方法:

select deptno,listagg(ename,',') within group(order by empno) from emp group by deptno

優點:(1)、可排序

(2)、可自定義分隔符

缺點:(1)、僅11g之後版本可用

(2)、返回最大字元數4000

該方法通過將資料聚合成xml結構,再轉換成varchar2或者clob型別。

使用方法:

select deptno,xmlagg(xmlparse(content ename||',' wellformed) order by empno).getstringval() from emp group by deptno;

select deptno,xmlagg(xmlparse(content ename||',' wellformed) order by empno).getclobval() from emp group by deptno;

優點:(1)、可排序

(2)、可返回clob型別容納大資料量資料

(3)、可自定義分隔符

(4)、10g可用

缺點:(1)、在不排序的情況下效率比wm_concat、zh_concat差

(2)、在排序情況下效率比listagg差

(3)、最終資料在後面或者前面會多乙個分隔符,需要再做處理

借助connect by實現資料聚合。

實現方法:

select deptno, res

from (select rn, level, deptno, sys_connect_by_path(ename, ',') res,

connect_by_isleaf il

from (select row_number() over(partition by deptno order by empno) rn,a.*

from emp a)

start with rn = 1

connect by deptno = prior deptno

and prior rn = rn - 1)

where il = 1

該方法實現複雜,效率低下,這裡不再討論。

不同場景下使用不同方法(最佳選擇):

10g11g以上

排序(varchar2)

xmlagg

listagg

排序(clob)

xmlagg

xmlagg

不排序(varchar2)

wm_concat

wm_concat

不排序(clob)

zh_concat

zh_concat

Oracle 分析函式與聚合函式(重點理解)

一 oracle分析函式的語法與作用 rank over query partition clause order by clause dense rank over query partition clause order by clause rownumber over query partit...

Oracle 分析函式與聚合函式(重點理解)

一 oracle分析函式的語法與作用 rank over query partition clause order by clause dense rank over query partition clause order by clause rownumber over query partit...

SQL 聚合函式 非聚合函式

聚合函式 聚合函式就是對一組值進行計算後返回單個值 即分組 聚合函式在計算時都會忽略空值 null 所有的聚合函式均為確定性函式。即任何時候使用一組相同的輸入值呼叫聚合函式執行後的返回值都是相同的,無二義性。2 聚合開窗函式 聚合函式加上 over 開窗函式就是聚合開窗函式。create table...