分組聚合函式使用

2021-09-26 01:49:59 字數 3835 閱讀 9906

1. mysql 的分組合併函式group_concat

group_concat()會計算哪些行屬於同一組,將屬於同一組的列顯示出來。要返回哪些列,由函

數引數(就是欄位名)決定。分組必須有個標準,就是根據group by指定的列進行分組。

例:select 分組字段,group_concat(合併字段) from 表名 group by  分組字段;

參考:2. oracle 的分組合併函式

2.1 wm_concat   

使用方法:select 分組字段,wm_concat(合併字段) from emp group by 分組字段;

優點:效率高。

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

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

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

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

2.2 zh_concat

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

2.3 listagg       

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

使用方法:select 分組字段,listagg(合併字段,',') within group(order by 排序字段) from emp group by 分組字段

優點:(1)、可排序

(2)、可自定義分隔符

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

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

2.4 xmlagg   

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

使用方法:

2.4.1  select 分組字段,xmlagg(xmlparse(content 合併字段||',' wellformed) order by 排序字段).getstrin**al() from emp group by 分組字段; // 返回的結果是字串型別。

2.4.2  select 分組字段,xmlagg(xmlparse(content 合併字段||',' wellformed) order by 排序字段).getclobval() from emp group by 分組字段; // 返回的結果是clob型別。          

優點:(1)、可排序

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

(3)、可自定義分隔符

(4)、10g可用

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

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

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

2.5 sys_connect_by_path

借助connect by實現資料聚合。

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

10g11g以上

排序(varchar2)

xmlagg

listagg

排序(clob)

xmlagg

xmlagg

不排序(varchar2)

wm_concat

wm_concat

不排序(clob)

zh_concat

zh_concat

以上方法參考:

2.6 多個函式組合 start with connect by prior,sys_connect_by_path, row_number() over

select 分組字段,ltrim(max(sys_connect_by_path(合併字段,',')),',') as values from (

select 分組字段,合併字段,row_number() over(partition by 分組字段,order by 分組字段) rn,

from test

)start with rn = 1 connect by rn - 1 = prior rn and 分組字段=prior 分組字段

group by 分組字段

order by 分組字段;

2.6.1 start with connect by prior語句

在select命令中使用connect by和start with子句可以查詢表中的樹型結構關係。其命令格式如下:

select… …

connect by

[start with];

其中:connect by子句說明每行資料將是按層次順序檢索,並規定將表中的資料連入樹型結構的關係中。prior運算子必須放置在連線關係的兩列中某乙個的前面。對於節點間的父子關係,prior運算子在一側表示父節點,在另一側表示子節點,從而確定查詢樹結構的順序是自頂向下還是自底向上。在連線關係中,除了可以使用列名外,還允許使用列表示式。start with子句為可選項,用來標識哪個節點作為查詢樹型結構的根節點。若該子句被省略,則表示所有滿足查詢條件的行作為根節點。

start with...connect by子句遞迴查詢一般用於乙個維護樹形結構的應用。

2.6.2 sys_connect_by_path

select ename 

from scott.emp 

start with ename = 'king'

connect by prior empno = mgr;

得到結果為: 

king   

jones   

scott   

adams   

ford   

smith   

blake   

allen   

ward   

martin   

turner   

james 

而:select sys_connect_by_path(ename, '>') "path"    

from scott.emp    

start with ename = 'king'    

connect by prior empno = mgr;   

--得到結果為:   

>king   

>king>jones   

>king>jones>scott   

>king>jones>scott>adams   

>king>jones>ford   

>king>jones>ford>smith   

>king>blake   

>king>blake>allen   

>king>blake>ward   

>king>blake>martin   

>king>blake>turner   

>king>blake>james   

>king>clark   

>king>clark>miller  

綜上所述:sys_connect_by_path函式的第乙個引數是形成樹形式的字段,第二個引數是父級和其子級分隔顯示用的分隔符!

2.6.3 row_number() over

row_number() over (partition by col1 order by col2)表示根據col1分組,在分組內部根據col2排序,而此函式計算的值就表示每組內部排序後的順序編號。

示例: 

col1   col2     row_num 

a      1700     1 

a      1800     2 

b      1085     1 

b      1710     2

參考:

pandas 分組聚合

綜合使用 資料鏈結 統計每個國家的星巴克的數量 按照單字段聚合 codeing utf 8 import pandas as pd import numpy as np df pd.read csv data starbucks store worldwide.csv 按國家進行分組後會有很多列 然...

分組聚合後unstacking

讀取employee資料集,求出每個種族的平均工資 employee pd.read csv data employee.csv employee.groupby race base salary mean astype int race american indian or alaskan nat...

DataFrame分組和聚合

一 分組 1 語法 grouped df.groupby by columns name grouped是乙個dataframegroupby物件,是可迭代的 遍歷 grouped中的每乙個元素都是乙個元祖 元祖 索引 分組的值 分組之後的dataframe 2 取值 grouped.count 獲...