聚集函數(shù)
聚集函數(shù)從一個(gè)輸入值的集合計(jì)算出一個(gè)單一值。 支持部分模式的聚合函數(shù)具備參與各種優(yōu)化的條件,例如并行聚合。
通用聚集函數(shù)
將所有輸入值,包括空值,收集到一個(gè)數(shù)組中。 | No |
將所有輸入數(shù)組連接到一個(gè)更高維度的數(shù)組中。(輸入必須都具有相同的維度,并且不能為空的(empty)或空值(null))。 | No |
計(jì)算所有非空輸入值的平均值(算術(shù)平均值)。 | Yes |
計(jì)算所有非空輸入值的逐位AND。 | Yes |
計(jì)算所有非空輸入值的逐位OR。 | Yes |
如果全部非空輸入值都為真則返回真,否則返回假。 | Yes |
如果任何非空輸入值為真則返回真,否則返回假。 | Yes |
計(jì)算輸入行的數(shù)量。 | Yes |
計(jì)算輸入值不為空的輸入行的數(shù)量。 | Yes |
這是對(duì)應(yīng) | Yes |
收集所有輸入值,包括空值,到一個(gè)JSON數(shù)組。根據(jù) | No |
將所有鍵/值對(duì)收集到一個(gè)JSON對(duì)象中。關(guān)鍵參數(shù)強(qiáng)制轉(zhuǎn)換為文本;值參數(shù)按照 | No |
計(jì)算非空輸入值的最大值。適用于任何數(shù)字、字符串、日期/時(shí)間或enum類型, 以及 | Yes |
計(jì)算非空輸入值的最小值。可用于任何數(shù)字、字符串、日期/時(shí)間或enum類型, 以及 | Yes |
連接非空輸入值到字符串中。第一個(gè)值之后的每個(gè)值前面都有相應(yīng)的 | No |
計(jì)算非空輸入值的總和。 | Yes |
連接非空的XML輸入值。 | No |
應(yīng)該注意的是,除了count
之外,這些函數(shù)在沒有選擇行時(shí)返回空值。 特別地,行數(shù)的sum
返回空(null),而不是預(yù)期的零,array_agg
在沒有輸入行時(shí)返回空(null)而不是空數(shù)組。 coalesce
函數(shù)可以在必要時(shí)用零或空數(shù)組代替空(null)。
聚合函數(shù) array_agg
,json_agg
, jsonb_agg
,json_object_agg
, jsonb_object_agg
, string_agg
,和 xmlagg
,以及類似的用戶定義的聚合函數(shù),根據(jù)輸入值的順序產(chǎn)生富有意義的不同的結(jié)果值。 默認(rèn)情況下,這種排序是不指定的,但可以通過在聚合調(diào)用中寫入ORDER BY
子句來控制。 或者,從排序的子查詢提供輸入值通常也可以。例如:
SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab;
注意,如果外部查詢級(jí)別包含其他處理,例如關(guān)聯(lián),則此方法可能會(huì)失敗,因?yàn)檫@可能導(dǎo)致子查詢的輸出在計(jì)算聚合之前重新排序。
### 注意
<span id="id-1.4.8.27.8.1" class="indexterm"></span><span id="id-1.4.8.27.8.2" class="indexterm"></span>
布爾聚合 `bool_and` 和 `bool_or` 對(duì)應(yīng)于標(biāo)準(zhǔn)SQL聚合 `every` 和 `any` 或 `some`. 本數(shù)據(jù)庫 支持 `every`, 但不支持 `any` 或 `some`, 因?yàn)闃?biāo)準(zhǔn)語法中存在模糊性:
```sql
SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;
這里ANY
可以被認(rèn)為是引入子查詢,或者是聚合函數(shù),如果子查詢返回一行布爾值。因此,不能為這些聚合提供標(biāo)準(zhǔn)名稱。
注意事項(xiàng)
習(xí)慣使用其他 SQL 數(shù)據(jù)庫管理系統(tǒng)的用戶可能會(huì)對(duì)count
聚合應(yīng)用于整個(gè)表時(shí)的性能感到失望。一個(gè)類似下面的查詢:
SELECT count(*) FROM sometable;
將需要與表大小成比例的工作:本數(shù)據(jù)庫將需要掃描整個(gè)表或包含表中所有行的索引。
用于統(tǒng)計(jì)的聚集函數(shù)表顯示了統(tǒng)計(jì)分析中常用的聚合函數(shù)。(這些被分離出來僅僅是為了避免使更常用的聚合列表混亂)。 顯示為接受numeric_type
的函數(shù)可用于所有類型smallint
, integer
,bigint
, numeric
, real
, 和 double precision
。 在描述中提及N
時(shí),它意味著所有輸入表達(dá)式都非空的輸入行數(shù)。在所有情況下,如果計(jì)算沒有意義,則返回 null,例如當(dāng)N
為 0 時(shí)。
用于統(tǒng)計(jì)的聚集函數(shù)
計(jì)算相關(guān)系數(shù)。 | Yes |
計(jì)算總體協(xié)方差。 | Yes |
計(jì)算樣本協(xié)方差。 | Yes |
計(jì)算自變量的平均值, | Yes |
計(jì)算因變量的平均值, | Yes |
計(jì)算兩個(gè)輸入都非空的行數(shù)。 | Yes |
計(jì)算由( | Yes |
計(jì)算相關(guān)系數(shù)的平方。 | Yes |
計(jì)算由( | Yes |
計(jì)算自變量的“平方和” | Yes |
計(jì)算獨(dú)立變量乘以因變量的“sum of products”, | Yes |
計(jì)算因變量的“平方和”, | Yes |
這是 | Yes |
計(jì)算輸入值的總體標(biāo)準(zhǔn)差。 | Yes |
計(jì)算輸入值的樣本標(biāo)準(zhǔn)差。 | Yes |
這是 | Yes |
計(jì)算輸入值的總體方差(總體標(biāo)準(zhǔn)差的平方)。 | Yes |
計(jì)算輸入值的樣本方差(樣本標(biāo)準(zhǔn)差的平方)。 | Yes |
有序集聚集函數(shù)表顯示了一些使用ordered-set aggregate語法的聚合函數(shù)。 這些函數(shù)有時(shí)被稱為“inverse distribution”函數(shù)。 它們的聚合輸入是通過ORDER BY
引入的,它們還可以接受未聚合的direct argument,但只計(jì)算一次。 所有這些函數(shù)在其聚合的輸入中都忽略空(null)值。 對(duì)于使用fraction(fraction)
參數(shù)的函數(shù),分?jǐn)?shù)值必須在 0 到 1 之間;否則將拋出一個(gè)錯(cuò)誤。但是,空分?jǐn)?shù)
值簡單地產(chǎn)生一個(gè)空結(jié)果。
有序集聚集函數(shù)
計(jì)算mode,即聚合參數(shù)最頻繁的值(如果有多個(gè)相同頻繁的值,第一個(gè)可以任意選擇)。聚合參數(shù)必須是可排序類型。 | No |
計(jì)算continuous percentile,該值對(duì)應(yīng)于聚合參數(shù)值的有序集合中的指定 | No |
計(jì)算多個(gè)連續(xù)的百分位數(shù)。結(jié)果是一個(gè)與 | No |
計(jì)算離散百分比(discrete percentile),即聚合參數(shù)值的有序集合中的第一個(gè)值,該值在排序中的位置等于或超過指定的 | No |
計(jì)算多個(gè)離散百分位數(shù)。 結(jié)果是一個(gè)與 | No |
列在假想集聚集函數(shù)表中的每個(gè)“hypothetical-set”聚合都與同名窗口函數(shù)相關(guān)聯(lián)。 在每種情況下,聚合的結(jié)果都是相關(guān)的窗口函數(shù)將為由args
構(gòu)造的“hypothetical”行返回的值,如果將這樣的行添加到sorted_args
表示的已排序行組中。 對(duì)于這些函數(shù)中的每一個(gè),args
中給出的直接參數(shù)列表必須與sorted_args
中給出的聚合參數(shù)的數(shù)量和類型匹配。 與大多數(shù)內(nèi)置聚合不同,這些聚合不是嚴(yán)格的,也就是說它們不會(huì)刪除包含空值的輸入行。空值根據(jù)ORDER BY
子句中指定的規(guī)則排序。
假想集聚集函數(shù)
計(jì)算假設(shè)行的排名,包括間隔,就是說在它的對(duì)等組中第一行的行號(hào)。 | No |
計(jì)算假設(shè)行的排名,沒有間隔;這個(gè)功能有效地計(jì)數(shù)對(duì)等組。 | No |
計(jì)算假設(shè)行的相關(guān)排行,也就是( | No |
計(jì)算累積分布,也就是(前面或具有假設(shè)行的對(duì)等行數(shù))/(總行數(shù))。取值范圍為 1/ | No |
分組操作
返回一個(gè)位掩碼以指示哪個(gè) |
GROUPING
函數(shù)的參數(shù)實(shí)際上并不求值,但它們必須與相關(guān)查詢級(jí)別的GROUP BY
子句中給出的表達(dá)式完全匹配。例如:
=> SELECT * FROM items_sold;
make | model | sales
-------+-------+-------
Foo | GT | 10
Foo | Tour | 20
Bar | City | 15
Bar | Sport | 5
(4 rows)
=> SELECT make, model, GROUPING(make,model), sum(sales) FROM items_sold GROUP BY ROLLUP(make,model);
make | model | grouping | sum
-------+-------+----------+-----
Foo | GT | 0 | 10
Foo | Tour | 0 | 20
Bar | City | 0 | 15
Bar | Sport | 0 | 5
Foo | | 1 | 30
Bar | | 1 | 20
| | 3 | 50
(7 rows)
在這里,前四行中的grouping
值0
表明這些已經(jīng)正常分組,在兩個(gè)分組列上。 值1
表示model
沒有在倒數(shù)兩行中分組,值3
表示無論是make
還是model
都沒有在最后一行中分組(因此,這是所有輸入行的聚合)。
MEDIAN
描述
該函數(shù)是一個(gè)假設(shè)連續(xù)分布模型的逆分布函數(shù)。它采用一個(gè)數(shù)字或日期時(shí)間值,并返回中間值或插值,該值在值排序后將成為中間值。在計(jì)算中忽略NULL
。
語法
MEDIAN(expr) [ OVER (query_partition_clause) ]
參數(shù)
參數(shù) | 說明 |
expr | 可以為任何數(shù)字?jǐn)?shù)據(jù)類型或者能夠隱式轉(zhuǎn)換為數(shù)字?jǐn)?shù)據(jù)類型的非數(shù)字?jǐn)?shù)據(jù)類型作為參數(shù)。 |
返回類型
如果只指定expr
,則函數(shù)返回的數(shù)據(jù)類型與參數(shù)的數(shù)字?jǐn)?shù)據(jù)類型相同。如果指定OVER
子句,則數(shù)據(jù)庫將確定具有最高數(shù)字優(yōu)先級(jí)的參數(shù),將其余參數(shù)隱式轉(zhuǎn)換為該數(shù)據(jù)類型,并返回該數(shù)據(jù)類型。
示例
create table median_test_t_1(i interval);
insert into median_test_t_1 values(interval '1 day 1 second');
insert into median_test_t_1 values(interval '2 day 1 second');
insert into median_test_t_1 values(interval '2 day 2 second');
select median(i) from median_test_t_1;
median
-------------
02 00:00:01
GROUPING_ID
描述
該函數(shù)返回與一行相關(guān)聯(lián)的GROUPING位向量對(duì)應(yīng)的數(shù)字。
GROUPING_ID僅適用于包含GROUP BY擴(kuò)展名(如ROLLUP或CUBE)和GROUPING函數(shù)的SELECT語句。
在具有許多GROUP BY表達(dá)式的查詢中,確定特定行的GROUP BY級(jí)別需要許多GROUPING函數(shù),這會(huì)導(dǎo)致繁瑣的SQL。GROUPING_ID在這些情況下很有用。
GROUPING_ID在功能上等效于獲取多個(gè)GROUPING函數(shù)的結(jié)果,并將它們連接到一個(gè)位向量(一個(gè)由1和0組成的字符串)中。通過使用GROUPING_ID,可以避免使用多個(gè)GROUPING函數(shù),并使行篩選條件更易于表達(dá)。使用GROUPING_ID可以更容易地進(jìn)行行篩選,因?yàn)樗璧男锌梢杂肎ROUPING_ID=n的單個(gè)條件來標(biāo)識(shí)。當(dāng)在單個(gè)表中存儲(chǔ)多個(gè)聚合級(jí)別時(shí),該函數(shù)特別有用。
語法
GROUPING_ID(expr[, expr]...)
參數(shù)
參數(shù) | 說明 |
expr | 為 |
返回類型
返回 NUMBER
數(shù)據(jù)類型。
示例
create table aggregate_functions_tb_agg(VARCHAR2_1 VARCHAR2(100),INTEGER_1 INTEGER);
insert into aggregate_functions_tb_agg(VARCHAR2_1,INTEGER_1) values('aggregate_functions_tb_agg',10);
select sum(INTEGER_1),grouping_id(VARCHAR2_1) from aggregate_functions_tb_agg group by VARCHAR2_1;
sum | grouping
-----+----------
10 | 0
GROUPING
描述
該函數(shù)將超級(jí)聚合行與常規(guī)分組行區(qū)分開來。ROLLUP和CUBE等GROUP BY擴(kuò)展生成超級(jí)聚合行,其中所有值的集合由null表示。使用GROUPING函數(shù),可以將表示超級(jí)聚合行中所有值集的null與常規(guī)行中的null區(qū)分開來。
GROUPING函數(shù)中的表達(dá)式必須與GROUP BY子句中的某個(gè)表達(dá)式匹配。
語法
GROUPING(expr)
參數(shù)
參數(shù) | 說明 |
expr | 為 |
返回類型
返回NUMBER
類型數(shù)據(jù)。
如果行中
expr
的值是表示所有值的集合的NULL
,則函數(shù)返回值1。否則,返回零。
示例
create temp view gstest1(a,b,v)
as values (1,1,10),(1,1,11),(1,2,12),(1,2,13),(1,3,14),
(2,3,15),
(3,3,16),(3,4,17),
(4,1,18),(4,1,19);
select a, b, grouping(a,b), sum(v), count(*), max(v)
from gstest1 group by rollup (a,b);
a | b | grouping | sum | count | max
---+---+----------+-----+-------+-----
1 | 1 | 0 | 21 | 2 | 11
1 | 2 | 0 | 25 | 2 | 13
1 | 3 | 0 | 14 | 1 | 14
1 | | 1 | 60 | 5 | 14
2 | 3 | 0 | 15 | 1 | 15
2 | | 1 | 15 | 1 | 15
3 | 3 | 0 | 16 | 1 | 16
3 | 4 | 0 | 17 | 1 | 17
3 | | 1 | 33 | 2 | 17
4 | 1 | 0 | 37 | 2 | 19
4 | | 1 | 37 | 2 | 19
| | 3 | 145 | 10 | 19
GRUOP_ID
描述
該函數(shù)區(qū)分由GROUP BY
規(guī)范產(chǎn)生的重復(fù)組。它在從查詢結(jié)果中篩選出重復(fù)分組時(shí)非常有用。它返回一個(gè)NUMBER
類型的值來唯一標(biāo)識(shí)重復(fù)的組。此函數(shù)僅適用于包含GROUP BY
子句的SELECT
語句。
如果某個(gè)特定分組存在n個(gè)重復(fù)項(xiàng),則GROUP_ID返回0到n-1范圍內(nèi)的數(shù)字。
語法
GROUP_ID()
返回類型
返回NUMBER類型數(shù)據(jù)。
示例
create table t(a int, b int, c int);
insert into t(a, b, c) values(1, 2, 3);
select a, b, c, grouping(a,b,c), group_id() from t group by cube(a,b,c) order by a, b, c, grouping(a, b, c), group_id();
a | b | c | grouping | group_id
---+---+---+----------+----------
1 | 2 | 3 | 0 | 0
1 | 2 | | 1 | 0
1 | | 3 | 2 | 0
1 | | | 3 | 0
| 2 | 3 | 4 | 0
| 2 | | 5 | 0
| | 3 | 6 | 0
| | | 7 | 0
COLLECT
描述
該函數(shù)將任何類型的列作為其參數(shù),并從所選行中創(chuàng)建輸入類型的嵌套表。要獲得該函數(shù)的結(jié)果,必須在CAST
函數(shù)中使用它。
若列本身是集合,則COLLECT的輸出是集合的嵌套表。
語法
COLLECT(column)
參數(shù)
參數(shù) | 說明 |
column | 可以為任何類型的列。 |
返回類型
返回結(jié)果是輸入類型的嵌套表。
示例
CREATE TABLE collect_warehouses
( warehouse_id NUMBER(3)
, warehouse_name VARCHAR2(35)
, location_id NUMBER(4)
);
CREATE TYPE collect_warehouse_name_t AS TABLE OF VARCHAR2(35);
INSERT INTO collect_warehouses VALUES (1,'Southlake, Texas',1400);
INSERT INTO collect_warehouses VALUES (2,'San Francisco',1500);
INSERT INTO collect_warehouses VALUES (3,'New Jersey',1600);
INSERT INTO collect_warehouses VALUES (4,'Seattle, Washington',1700);
SELECT CAST(COLLECT(warehouse_name) AS collect_warehouse_name_t) "Warehouses" FROM collect_warehouses;
Warehouses
-------------------------------------------------------------------------
{"Southlake, Texas","San Francisco","New Jersey","Seattle, Washington"}