Hologres通用聚合函數(shù)
Hologres兼容PostgreSQL,支持使用標(biāo)準(zhǔn)的PostgreSQL語法進(jìn)行開發(fā)。
兼容PostgreSQL聚合函數(shù)
Hologres已支持的通用聚合函數(shù)列表如下。當(dāng)前Hologres版本支持的函數(shù)是PostgreSQL的一個(gè)子集,函數(shù)的使用方法請參見通用聚合函數(shù)。
函數(shù)名 | 描述 | 用例 | 結(jié)果 |
array_agg(anyelement) | 將表達(dá)式的值串聯(lián)到數(shù)組中。暫不支持JSON、JSONB、TIMETZ、INTERVAL、INET、OID、UUID數(shù)據(jù)類型和數(shù)組類型。 | array_agg(c1) |
|
avg(bigint) | 求BIGINT類型表達(dá)式中非空值的平均值。 | avg(c1) | 2.000000 |
avg(float8) | 求FLOAT8類型表達(dá)式中非空值的平均值。 | avg(c1) | 2 |
avg(float4) | 求FLOAT4類型表達(dá)式中非空值的平均值。 | avg(c1) | 2 |
avg(int) | 求INT類型表達(dá)式中非空值的平均值。 | avg(c1) | 2.000000 |
bit_and(bigint) | 對BIGINT類型表達(dá)式中的非空值執(zhí)行按位與運(yùn)算。 | bit_and(c1) | 0 |
bit_and(int) | 對INT類型表達(dá)式中的非空值執(zhí)行按位與運(yùn)算。 | bit_and(c1) | 0 |
bit_or(bigint) | 對BIGINT類型表達(dá)式中的非空值執(zhí)行按位或運(yùn)算。 | bit_or(c1) | 3 |
bit_or(int) | 對INT類型表達(dá)式中的非空值執(zhí)行按位或運(yùn)算。 | bit_or(c1) | 3 |
bool_and(bool) | 如果BOOL表達(dá)式的值均為TRUE,則函數(shù)結(jié)果返回TRUE,否則返回FALSE。 | bool_and(c1) | f |
bool_or(bool) | 如果BOOL表達(dá)式的值包含TRUE,則函數(shù)結(jié)果返回TRUE,否則返回FALSE。 | bool_or(c1) | t |
count(*) | 返回指定表的行數(shù)。 | count(*) | 3 |
count(bigint) | 求BIGINT類型表達(dá)式的輸入行數(shù)。 說明 BIGINT類型表達(dá)式的值不為NULL。 | count(c1) | 3 |
count(numeric) | 求NUMERIC類型表達(dá)式的輸入行數(shù)。 說明 NUMERIC類型表達(dá)式的值不為NULL。 | count(c1) | 3 |
every(bool) | 如果BOOL表達(dá)式的值均為TRUE,則函數(shù)結(jié)果返回TRUE,否則返回FALSE。 | 無 | 無 |
max(bigint) | 求BIGINT類型表達(dá)式的最大值。 | max(c1) | 3 |
max(float8) | 求FLOAT8類型表達(dá)式的最大值。 | max(c1) | 3 |
max(float4) | 求FLOAT4類型表達(dá)式的最大值。 | max(c1) | 3 |
max(int) | 求INT類型表達(dá)式的最大值。 | max(c1) | 3 |
max(numeric) | 求NUMERIC類型表達(dá)式的最大值。 | max(c1) | 3 |
min(bigint) | 求BIGINT類型表達(dá)式的最小值。 | min(c1) | 1 |
min(float8) | 求FLOAT8類型表達(dá)式的最小值。 | min(c1) | 1 |
min(float4) | 求FLOAT4類型表達(dá)式的最小值。 | min(c1) | 1 |
min(int) | 求INT類型表達(dá)式的最小值。 | min(c1) | 1 |
min(numeric) | 求NUMERIC類型表達(dá)式的最小值。 | min(c1) | 1 |
sum(bigint) | 求BIGINT類型表達(dá)式所有值的總和。 | sum(c1) | 6 |
sum(float8) | 求FLOAT8類型表達(dá)式所有值的總和。 | sum(c1) | 6 |
sum(float4) | 求FLOAT4類型表達(dá)式所有值的總和。 | sum(c1) | 6 |
sum(int) | 求INT類型表達(dá)式所有值的總和。 | sum(c1) | 6 |
sum(numeric) | 求NUMERIC類型表達(dá)式所有值的總和。 | sum(c1) | 6.0 |
string_agg(expression, delimiter) | 使用指定分隔符將指定表達(dá)式的非空值串聯(lián)成字符串。 | string_agg(c1, '-') | a-b-c |
corr(Y, X) | 求相關(guān)系數(shù)。 | corr(c1, c2) | 無 |
covar_pop(Y, X) | 求總體協(xié)方差。 | covar_pop(c1, c2) | 無 |
covar_samp(Y, X) | 求樣本協(xié)方差。 | covar_samp(c1, c2) | 無 |
regr_avgx(Y, X) | 求自變量的平均值。 | reg_avgx(c1, c2) | 無 |
regr_avgy(Y, X) | 求因變量的平均值。 | reg_avgy(c1, c2) | 無 |
regr_count(Y, X) | 求兩個(gè)輸入?yún)?shù)中都不為空的行數(shù)。 | regr_count(c1, c2) | 無 |
regr_intercept(Y, X) | 求由(X,Y)確定的最小方差擬合的縱軸截距。 | reg_intercept(c1, c2) | 無 |
regr_r2(Y, X) | 求相關(guān)系數(shù)的平方。 | regr_r2(c1, c2) | 無 |
regr_slope(Y, X) | 求由(X,Y)確定的最小方差擬合的斜率。 | regr_slope(c1, c2) | 無 |
regr_sxx(Y, X) | 求自變量的平方和 | regr_sxx(c1, c2) | 無 |
regr_sxy(Y, X) | 求自變量和因變量的乘積和 | regr_sxy(c1, c2) | 無 |
regr_syy(Y, X) | 求因變量的平方和 | regr_syy(c1, c2) | 無 |
stddev(int) | 求INT類型表達(dá)式的樣本標(biāo)準(zhǔn)差。 | stddev(c1) | 無 |
stddev(numeric) | 求NUMERIC類型表達(dá)式的樣本標(biāo)準(zhǔn)差。 | stddev(c1) | 無 |
stddev(float8) | 求FLOAT8類型表達(dá)式的樣本標(biāo)準(zhǔn)差。 | stddev(c1) | 無 |
stddev_pop(int) | 求INT類型表達(dá)式的總體標(biāo)準(zhǔn)差。 | stddev_pop(c1) | 無 |
stddev_pop(numeric) | 求NUMERIC類型表達(dá)式的總體標(biāo)準(zhǔn)差。 | stddev_pop(c1) | 無 |
stddev_pop(float8) | 求FLOAT8類型表達(dá)式的總體標(biāo)準(zhǔn)差。 | stddev_pop(c1) | 無 |
stddev_samp(int) | 求INT類型表達(dá)式的樣本標(biāo)準(zhǔn)差。 | stddev_samp(c1) | 無 |
stddev_samp(numeric) | 求NUMERIC類型表達(dá)式的樣本標(biāo)準(zhǔn)差。 | stddev_samp(c1) | 無 |
stddev_samp(float8) | 求FLOAT8類型表達(dá)式的樣本標(biāo)準(zhǔn)差。 | stddev_samp(c1) | 無 |
variance(int) | 求INT類型表達(dá)式的樣本方差。 | variance(c1) | 無 |
variance(numeric) | 求NUMERIC類型表達(dá)式的樣本方差。 | variance(c1) | 無 |
var_pop(float8) | 求FLOAT8類型表達(dá)式的總體方差。 | var_pop(c1) | 無 |
var_pop(int) | 求INT類型表達(dá)式的總體方差。 | var_pop(c1) | 無 |
var_pop(numeric) | 求NUMERIC類型表達(dá)式的總體方差。 | var_pop(c1) | 無 |
var_samp(float8) | 求FLOAT8類型表達(dá)式的樣本方差。 | var_samp(c1) | 無 |
var_samp(int) | 求INT類型表達(dá)式的樣本方差。 | var_samp(c1) | 無 |
var_samp(numeric) | 求NUMERIC類型表達(dá)式的樣本方差。 | var_samp(c1) | 無 |
其他聚合函數(shù)
APPROX_COUNT_DISTINCT
語法
APPROX_COUNT_DISTINCT
函數(shù)用于計(jì)算某一列去重后的行數(shù),結(jié)果只能返回一個(gè)值,并且該值為近似值。APPROX_COUNT_DISTINCT ( <column> )
參數(shù)說明如下表所示。
參數(shù)
描述
column
需要近似計(jì)算去重后行數(shù)的列。
APPROX_COUNT_DISTINCT
采用HyperLogLog基數(shù)估計(jì)的方式進(jìn)行非精確的COUNT DISTINCT計(jì)算。非精確的COUNT DISTINCT計(jì)算能提升查詢性能,尤其是對于column的離散值比較大的情況,誤差率平均可以控制在0.1%-1%
以內(nèi)。該函數(shù)適用于對性能敏感并且可以接受誤差的場景。同時(shí),您也可以通過
COUNT DISTINCT ( column )
的方式進(jìn)行精確的COUNT DISTINCT計(jì)算,使用時(shí)資源開銷會(huì)比較大。調(diào)整誤差率
通過使用以下參數(shù)調(diào)整誤差率。
SET hg_experimental_approx_count_distinct_precision = 20;
支持取值范圍為[12,20],默認(rèn)值為17。
精度參數(shù)含義為HyperLogLog算法的分桶bit位個(gè)數(shù),參數(shù)越大,代表分桶越多,理論精度越高。
精度參數(shù)取值越高,計(jì)算時(shí)間和內(nèi)存開銷也會(huì)相應(yīng)增大,但都遠(yuǎn)遠(yuǎn)小于精確的
COUNT DISTINCT ( column )
語句帶來的開銷,因此,推薦選用APPROX_COUNT_DISTINCT替換COUNT DISTINCT ( column )
。當(dāng)精度參數(shù)設(shè)置為17以上時(shí),Hologres采用HyperLogLog++算法,會(huì)對返回值做誤差修正,以進(jìn)一步降低誤差、穩(wěn)定誤差。例如hg_experimental_approx_count_distinct_precision取值為20時(shí),多數(shù)情況下,可以降低到0.01-0.2%不等的誤差率。
示例
計(jì)算O_CUSTKEY列去重后行數(shù)的近似值,示例語句如下。
SELECT APPROX_COUNT_DISTINCT ( O_CUSTKEY ) FROM ORDERS; --全局設(shè)置精度20,計(jì)算O_CUSTKEY列去重后行數(shù)的近似值 ALTER DATABASE dbname SET hg_experimental_approx_count_distinct_precision = 20; SELECT APPROX_COUNT_DISTINCT ( O_CUSTKEY ) FROM ORDERS; --在Session級別設(shè)置精度20 SET hg_experimental_approx_count_distinct_precision = 20; SELECT APPROX_COUNT_DISTINCT ( O_CUSTKEY ) FROM ORDERS;
UNIQ
使用限制
僅Hologres V1.3及以上版本支持使用UNIQ函數(shù),如果您的實(shí)例是V1.3以下版本,請您使用自助升級或加入Hologres釘釘交流群反饋,詳情請參見如何獲取更多的在線支持?。
SQL中必須包含GROUP BY,且GROUP BY的字段比較均勻(不傾斜),UNIQ才能發(fā)揮比COUNT DISTINCT更好的性能。
語法
UNIQ
函數(shù)用于計(jì)算某一列去重后的行數(shù),結(jié)果返回一個(gè)去重值。UNIQ ( < column > );
參數(shù)說明如下。
參數(shù)
描述
column
需要計(jì)算去重后行數(shù)的列。
支持SMALLINT、INTEGER、BIGINT、REAL、DOUBLE PRECISION、TEXT、VARCHAR、TIMESTAMP、TIMESTAMPTZ、DATE、TIMETZ、UUID類型。
使用說明如下。
一般來說,UNIQ在GROUP BY KEY的KEY基數(shù)較高時(shí),比COUNT DISTINCT性能更好,同時(shí)UNIQ比COUNT DISTINCT更節(jié)省內(nèi)存,如果使用COUNT DISTINCT遇到內(nèi)存超限時(shí),可以換用UNIQ。
從Hologres V2.1版本開始,Hologres針對COUNT DISTINCT場景做了非常多的性能優(yōu)化(包括單個(gè)COUNT DISTINCT、多個(gè)COUNT DISTINCT、數(shù)據(jù)傾斜、SQL沒有GROUP BY字段等場景),無需再手動(dòng)改寫成UNIQ實(shí)現(xiàn),即可實(shí)現(xiàn)更好的性能。詳情請參見Count Distinct優(yōu)化。
示例
計(jì)算ORDERS表的O_CUSTKEY列去重后行的數(shù)值語句如下。
SELECT UNIQ ( O_CUSTKEY ) FROM ORDERS; --不同O_ORDERSTATUS下O_CUSTKEY去重?cái)?shù) SELECT O_ORDERSTATUS, UNIQ ( O_CUSTKEY ) FROM ORDERS GROUP BY O_ORDERSTATUS;
MAX_BY與MIN_BY
使用限制
該函數(shù)適用于Hologres V1.3.36及以上版本的實(shí)例,若實(shí)例低于該版本,請您通過加入實(shí)時(shí)數(shù)倉Hologres交流群申請升級實(shí)例,詳情請參見如何獲取更多的在線支持?。
語法
MAX_BY與MIN_BY函數(shù)用于比較某一列(y列)取值的大小,當(dāng)y列取值為最大值或最小值時(shí),返回對應(yīng)著的另外一列(x列)的取值。語法如下。
說明數(shù)字類型按數(shù)字大小進(jìn)行比較,非數(shù)字類型按照字典排序進(jìn)行比較。
MAX_BY(x, y); MIN_BY(x, y);
參數(shù)說明如下。
參數(shù)
描述
y
需要比較大小的列。
x
另外一列的字段名。
當(dāng)y列取值為最大值時(shí),MAX_BY函數(shù)返回此列的取值結(jié)果。
當(dāng)y列取值為最小值時(shí),MIN_BY函數(shù)返回此列的取值結(jié)果。
使用說明如下。
當(dāng)MAX_BY函數(shù)中y列的最大值存在多個(gè)時(shí),則返回對應(yīng)的多個(gè)x值中的最大值。
當(dāng)MIN_BY函數(shù)中y列的最小值存在多個(gè)時(shí),則返回對應(yīng)的多個(gè)x值中的最小值。
y列的NULL值不參與計(jì)算。當(dāng)y列所有值均為NULL時(shí),函數(shù)返回值為NULL。
示例
使用
MAX_BY
函數(shù),通過GROUP BY
對id進(jìn)行分組,查詢每組cost最大值對應(yīng)的name值。示例語句如下。SELECT id, max_by(name, cost) FROM test GROUP BY id; id | max_by ----+-------- 2 | bb 1 | aaa 3 | c (3 rows)
使用
MAX_BY
函數(shù),查詢cost最大值(存在多個(gè))對應(yīng)的name值。示例語句如下。select max_by(name, cost) from test; max_by -------- bb (1 row)
使用
MIN_BY
函數(shù),查詢cost最小值對應(yīng)的name值。示例語句如下。SELECT min_by(name, cost) FROM test; min_by -------- cc (1 row)