Hologres通用聚合函數(shù)
Hologres兼容PostgreSQL,支持使用標(biāo)準(zhǔn)的PostgreSQL語法進(jìn)行開發(fā),本文為您介紹Hologres已支持的通用聚合函數(shù)。
當(dāng)前Hologres版本支持的函數(shù)是PostgreSQL的一個子集,函數(shù)的使用方法請參見通用聚合函數(shù)。 Hologres已支持的通用聚合函數(shù)列表如下。
函數(shù) | 功能 |
計算某一列去重后的行數(shù),結(jié)果只能返回一個值,并且該值為近似值。 | |
將表達(dá)式的值串聯(lián)到數(shù)組中。 | |
計算BIGINT、FLOAT8、FLOAT4或INT類型表達(dá)式中非空值的平均值。 | |
在BIGINT或INT類型的表達(dá)式中,對非空值進(jìn)行按位與運算。 | |
對BIGINT或INT類型表達(dá)式中的非空值進(jìn)行按位或運算。 | |
計算BOOLEAN類型表達(dá)式中值是否均為TRUE。 | |
計算BOOLEAN類型表達(dá)式中值是否包含TRUE。 | |
計算兩個變量之間的相關(guān)系數(shù)。 | |
獲取指定表的行數(shù)或BIGINT、NUMERIC類型表達(dá)式的輸入行數(shù)。 | |
計算總體協(xié)方差。 | |
計算樣本協(xié)方差。 | |
判斷BOOLEAN表達(dá)式的值是否均為TRUE。 | |
獲取BIGINT、FLOAT8、FLOAT4、INT或NUMERIC類型表達(dá)式的最大值。 | |
用于比較某一列(y列)的最大值,并獲取y列最大值對應(yīng)其他指定列(x列)的值。 | |
獲取BIGINT、FLOAT8、FLOAT4、INT或NUMERIC類型表達(dá)式的最小值。 | |
用于比較某一列(y列)的最小值,并獲取y列最小值對應(yīng)其他指定列(x列)的值。 | |
計算自變量(X)的平均值。 | |
計算因變量(Y)的平均值。 | |
計算輸入?yún)?shù)中都不為空的行數(shù)。 | |
計算相關(guān)系數(shù)的平方。 | |
計算由 | |
計算最小方差擬合的斜率。 | |
計算自變量(X)的平方和,即 | |
計算自變量(X)和因變量(Y)的乘積和,即 | |
獲取BIGINT、FLOAT8、FLOAT4、INT或NUMERIC類型表達(dá)式所有值的總和。 | |
計算INT、NUMERIC或FLOAT8類型表達(dá)式的樣本標(biāo)準(zhǔn)差。 | |
計算INT、NUMERIC或FLOAT8類型表達(dá)式的總體標(biāo)準(zhǔn)差。 | |
計算INT、NUMERIC、FLOAT8類型表達(dá)式的樣本標(biāo)準(zhǔn)差。 | |
將TEXT類型表達(dá)式中的非空值使用指定分隔符串聯(lián)成字符串。 | |
用于計算某一列去重后的行數(shù)。 | |
計算INT、NUMERIC類型表達(dá)式的樣本方差。 | |
計算FLOAT8、INT或NUMERIC類型表達(dá)式的總體方差。 | |
計算INT、FLOAT8或NUMERIC類型表達(dá)式的樣本方差。 |
示例數(shù)據(jù)
-- 創(chuàng)建表
CREATE TABLE example_table(
c1 INT,
c2 BOOLEAN,
c3 VARCHAR(10),
c4 DECIMAL(3, 1),
c5 TEXT,
c6 FLOAT8,
c7 FLOAT8
);
-- 插入數(shù)據(jù)
INSERT INTO example_table (c1, c2, c3, c4, c5, c6, C7) VALUES
(1, true, 'a', 1.1, 3, 6, 7),
(2, false, 'b', 2.2, 4, 6, 2.6);
APPROX_COUNT_DISTINCT
描述:計算某一列去重后的行數(shù),結(jié)果只能返回一個值,并且該值為近似值。
APPROX_COUNT_DISTINCT ( <column> )
參數(shù)說明
column:必填,需要近似計算去重后行數(shù)的列。
使用說明
APPROX_COUNT_DISTINCT
函數(shù)采用HyperLogLog基數(shù)估計的方式進(jìn)行非精確的COUNT DISTINCT計算。非精確的COUNT DISTINCT計算能提升查詢性能,尤其是對于column的離散值比較大的情況,誤差率平均可以控制在0.1%~1%
以內(nèi),適用于對性能敏感并且可以接受誤差的場景。您可通過以下參數(shù),調(diào)整誤差率。SET hg_experimental_approx_count_distinct_precision = 20;
支持取值范圍為[12,20],默認(rèn)值為17。
精度參數(shù)含義為HyperLogLog算法的分桶bit位個數(shù),參數(shù)越大,代表分桶越多,理論精度越高。
精度參數(shù)取值越高,計算時間和內(nèi)存開銷也會相應(yīng)增大,但都遠(yuǎn)遠(yuǎn)小于精確的
COUNT DISTINCT ( column )
語句帶來的開銷,因此,推薦選用APPROX_COUNT_DISTINCT
替換COUNT DISTINCT ( column )
。當(dāng)精度參數(shù)設(shè)置為17以上時,Hologres采用HyperLogLog++算法,會對返回值做誤差修正,以進(jìn)一步降低誤差、穩(wěn)定誤差。
例如:hg_experimental_approx_count_distinct_precision取值為20時,多數(shù)情況下,可以降低到0.01~0.2%不等的誤差率。
說明您還可通過
COUNT DISTINCT ( column )
的方式進(jìn)行精確的COUNT DISTINCT計算,使用時資源開銷會比較大。示例
以下示例使用MaxCompute提供的公開數(shù)據(jù)集TPC-H的ORDERS表。您無需進(jìn)行任何額外準(zhǔn)備,只需運行以下SQL語句。
-- 創(chuàng)建外部表 IMPORT FOREIGN SCHEMA public_data LIMIT TO (ORDERS_10g) FROM SERVER odps_server INTO public options (if_table_exist 'update'); -- 創(chuàng)建內(nèi)部表 BEGIN; CREATE TABLE ORDERS ( O_ORDERKEY bigint NOT NULL PRIMARY KEY, O_CUSTKEY int NOT NULL, O_ORDERSTATUS text NOT NULL, O_TOTALPRICE DECIMAL(12, 2) NOT NULL, O_ORDERDATE timestamptz NOT NULL, O_ORDERPRIORITY text NOT NULL, O_CLERK text NOT NULL, O_SHIPPRIORITY int NOT NULL, O_COMMENT text NOT NULL ); CALL set_table_property ('ORDERS', 'segment_key', 'O_ORDERDATE'); CALL set_table_property ('ORDERS', 'distribution_key', 'O_ORDERKEY'); CALL set_table_property ('ORDERS', 'bitmap_columns', 'O_ORDERKEY,O_CUSTKEY,O_ORDERSTATUS,O_ORDERPRIORITY,O_CLERK,O_SHIPPRIORITY,O_COMMENT'); CALL set_table_property ('ORDERS', 'dictionary_encoding_columns', 'O_ORDERSTATUS,O_ORDERPRIORITY,O_CLERK,O_COMMENT'); COMMENT ON COLUMN ORDERS.O_ORDERKEY IS '訂單編號'; COMMENT ON COLUMN ORDERS.O_CUSTKEY IS '顧客序號'; COMMENT ON COLUMN ORDERS.O_ORDERSTATUS IS '訂單狀態(tài)'; COMMENT ON COLUMN ORDERS.O_TOTALPRICE IS '總價'; COMMENT ON COLUMN ORDERS.O_ORDERDATE IS '下單日期'; COMMENT ON COLUMN ORDERS.O_ORDERPRIORITY IS '訂單優(yōu)先級'; COMMENT ON COLUMN ORDERS.O_CLERK IS '收銀員'; COMMENT ON COLUMN ORDERS.O_SHIPPRIORITY IS '發(fā)貨優(yōu)先級'; COMMENT ON COLUMN ORDERS.O_COMMENT IS '備注'; COMMIT; -- 數(shù)據(jù)導(dǎo)入內(nèi)表 INSERT INTO ORDERS SELECT * FROM ORDERS_10g;
計算O_CUSTKEY列去重后行數(shù)的近似值。
SELECT APPROX_COUNT_DISTINCT ( O_CUSTKEY ) FROM ORDERS;
返回結(jié)果如下。
approx_count_distinct ----------------------- 1000422
全局設(shè)置精度為20,計算O_CUSTKEY列去重后行數(shù)的近似值。
ALTER DATABASE dbname SET hg_experimental_approx_count_distinct_precision = 20; SELECT APPROX_COUNT_DISTINCT ( O_CUSTKEY ) FROM ORDERS;
返回結(jié)果如下。
approx_count_distinct ----------------------- 1000422
Session級別設(shè)置精度為20,計算O_CUSTKEY列去重后行數(shù)的近似值。
--在Session級別設(shè)置精度20 SET hg_experimental_approx_count_distinct_precision = 20; SELECT APPROX_COUNT_DISTINCT ( O_CUSTKEY ) FROM ORDERS;
返回結(jié)果如下。
approx_count_distinct ----------------------- 998854
ARRAY_AGG
描述:將表達(dá)式的值串聯(lián)到數(shù)組中。
ARRAY_AGG(expression)
參數(shù)說明
expression:必填,除JSON、JSONB、TIMETZ、INTERVAL、INET、OID、UUID數(shù)據(jù)類型和數(shù)組類型之外的,其他格式的表達(dá)式。
返回值說明
返回ARRAY類型。
示例
SELECT ARRAY_AGG(c1) FROM example_table;
返回結(jié)果如下。
array_agg ----------- {2,1}
AVG
描述:計算BIGINT、FLOAT8、FLOAT4或INT類型表達(dá)式中非空值的平均值。
AVG(expression)
參數(shù)說明
expression:必填,BIGINT、FLOAT8、FLOAT4或INT類型表達(dá)式。
返回值說明
與參數(shù)類型一致。
示例
SELECT AVG(c7) FROM example_table;
返回結(jié)果如下。
avg ---------- 1.500000
BIT_AND
描述:在BIGINT或INT類型的表達(dá)式中,對非空值進(jìn)行按位與運算。
BIT_AND(expression)
參數(shù)說明
expression:必填,BIGINT或INT類型表達(dá)式。
返回值說明
與參數(shù)類型一致。
示例
SELECT BIT_AND(c1) FROM example_table;
返回結(jié)果如下。
bit_and --------- 0
BIT_OR
描述:對BIGINT或INT類型表達(dá)式中的非空值進(jìn)行按位或運算。
BIT_OR(expression)
參數(shù)說明
expression:必填,BIGINT或INT類型表達(dá)式。
返回值說明
與參數(shù)類型一致。
示例
SELECT BIT_OR(c1) FROM example_table;
返回結(jié)果如下。
bit_or -------- 3
BOOL_AND
描述:計算BOOLEAN類型表達(dá)式中值是否均為TRUE。
BOOL_AND(bool)
參數(shù)說明
bool:必填,BOOLEAN類型表達(dá)式。
返回值說明
返回BOOLEAN類型,若表達(dá)式中值均為TRUE,則返回TRUE(t),否則返回FALSE(f)。
示例
SELECT BOOL_AND(c2) FROM example_table;
返回結(jié)果如下。
bool_and ---------- f
BOOL_OR
描述:計算BOOLEAN類型表達(dá)式中值是否包含TRUE。
BOOL_OR(bool)
參數(shù)說明
bool:必填,BOOLEAN類型表達(dá)式。
返回值說明
返回BOOLEAN類型,若表達(dá)式中值包含TRUE,則返回TRUE(t),否則返回FALSE(f)。
示例
SELECT BOOL_OR(c2) FROM example_table;
返回結(jié)果如下。
bool_or --------- t
CORR
描述:計算兩個變量之間的相關(guān)系數(shù)。
CORR(Y, X)
說明參數(shù)類型僅支持DOUBLE PRECISION、FLOAT或FLOAT8類型。
參數(shù)說明
Y和X:必填,DOUBLE PRECISION、FLOAT或FLOAT8類型表達(dá)式。
返回值說明
與參數(shù)類型一致。
示例
SELECT CORR(c6, c7) FROM example_table;
返回結(jié)果如下。
corr ------
COUNT
描述:獲取指定表的行數(shù)或BIGINT、NUMERIC類型表達(dá)式的輸入行數(shù)。
獲取指定表的行數(shù)
COUNT(*)
獲取BIGINT、NUMERIC類型表達(dá)式的輸入行數(shù)
COUNT(expression)
參數(shù)說明:必填,BIGINT、NUMERIC類型的表達(dá)式值不為NULL。
返回值說明
返回BIGINT類型。
示例
SELECT COUNT(*) FROM example_table;
返回結(jié)果如下。
count ------- 2
COVAR_POP
描述:計算總體協(xié)方差。
COVAR_POP(Y, X)
參數(shù)說明
Y和X:必填,DOUBLE PRECISION、FLOAT或FLOAT8類型表達(dá)式。
返回值說明
與參數(shù)類型一致。
示例
SELECT COVAR_POP(c6, c7) FROM example_table;
返回結(jié)果如下。
covar_pop --------------------- 3.5527136788005e-15
COVAR_SAMP
描述:計算樣本協(xié)方差。
COVAR_SAMP(Y, X)
參數(shù)說明
Y和X:必填,DOUBLE PRECISION、FLOAT或FLOAT8類型表達(dá)式。
返回值說明
與參數(shù)類型一致。
示例
SELECT COVAR_SAMP(c6, c7) FROM example_table;
返回結(jié)果如下。
covar_samp -------------------- 7.105427357601e-15
EVERY
描述:判斷BOOLEAN表達(dá)式的值是否均為TRUE。
EVERY(bool)
參數(shù)說明
bool:必填,BOOLEAN類型表達(dá)式。
返回值說明
返回BOOLEAN類型,若表達(dá)式的值均為TRUE,則返回TRUE(t),否則返回FALSE(f)。
示例
SELECT EVERY(c2) FROM example_table;
返回結(jié)果
every ------- f
MAX
描述:獲取BIGINT、FLOAT8、FLOAT4、INT或NUMERIC類型表達(dá)式的最大值。
MAX(expression)
參數(shù)說明
expression:必填,BIGINT、FLOAT8、FLOAT4、INT或NUMERIC類型表達(dá)式。
返回值說明
與參數(shù)類型一致。
示例
SELECT MAX(c1) FROM example_table;
返回結(jié)果如下。
max ----- 2
MAX_BY
描述:用于比較某一列(y列)的最大值,并獲取y列最大值對應(yīng)其他指定列(x列)的值。
MAX_BY(x, y);
說明數(shù)字類型按數(shù)字大小進(jìn)行比較,非數(shù)字類型按照字典排序進(jìn)行比較。
參數(shù)說明
y:必填,需要獲取最大值的列名稱。若y列存在NULL值,則該列將不參與計算。
x:必填,y列最大值時,需獲取其他列值的列名稱。
使用說明
僅Hologres V1.3.36及以上版本的實例支持使用MAX_BY函數(shù)。
說明若實例低于該版本,請您通過加入實時數(shù)倉Hologres交流群申請升級實例,詳情請參見如何獲取更多的在線支持?
返回值說明
當(dāng)y列取值為最大值時,返回對應(yīng)x列的值。
當(dāng)y列所有值均為NULL時,函數(shù)返回值為NULL。
當(dāng)MAX_BY函數(shù)中y列的最大值存在多個時,則返回對應(yīng)的多個x值中的最大值。
示例
--示例數(shù)據(jù) DROP TABLE IF EXISTS test; CREATE TABLE IF NOT EXISTS test ( id INT, name TEXT, cost INT ); INSERT INTO test VALUES (1, 'a', 100), (1, 'aa', 200), (1, 'aaa', 300), (2, 'b', 150), (2, 'bb', 300), (3, 'c', 150), (3, 'cc', 50);
查詢cost列最大值(存在多個)對應(yīng)name列的值。
SELECT max_by(name, cost) FROM test;
返回結(jié)果如下。
max_by -------- aaa
MIN
描述:獲取BIGINT、FLOAT8、FLOAT4、INT或NUMERIC類型表達(dá)式的最小值。
MIN(expression)
參數(shù)說明
expression:必填,BIGINT、FLOAT8、FLOAT4、INT或NUMERIC類型。
返回值類型
與參數(shù)類型一致。
示例
SELECT MIN(c1) FROM example_table;
返回結(jié)果如下。
min ----- 1
MIN_BY
描述:用于比較某一列(y列)的最小值,并獲取y列最小值對應(yīng)其他指定列(x列)的值。
MIX_BY(x, y);
說明數(shù)字類型按數(shù)字大小進(jìn)行比較,非數(shù)字類型按照字典排序進(jìn)行比較。
參數(shù)說明
y:必填,需要獲取最小值的列名稱。若y列存在NULL值,則該列將不參與計算。
x:必填,y列最小值時,需獲取其他列值的列名稱。
使用說明
僅Hologres V1.3.36及以上版本的實例支持使用MAX_BY與MIN_BY函數(shù)。
說明若實例低于該版本,請您通過加入實時數(shù)倉Hologres交流群申請升級實例,詳情請參見如何獲取更多的在線支持?
返回值說明
當(dāng)y列取值為最小值時,返回對應(yīng)x列的值。
當(dāng)y列所有值均為NULL時,函數(shù)返回值為NULL。
當(dāng)MIN_BY函數(shù)中y列的最小值存在多個時,則返回對應(yīng)的多個x值中的最小值。
示例
--示例數(shù)據(jù) DROP TABLE IF EXISTS test; CREATE TABLE IF NOT EXISTS test ( id INT, name TEXT, cost INT ); INSERT INTO test VALUES (1, 'a', 100), (1, 'aa', 200), (1, 'aaa', 300), (2, 'b', 150), (2, 'bb', 300), (3, 'c', 150), (3, 'cc', 50);
查詢cost列最小值對應(yīng)的name列的值。
SELECT MIX_BY(name, cost) FROM test;
返回結(jié)果如下。
min_by -------- cc (1 row)
REGR_AVGX
描述:計算自變量(X)的平均值。
REGR_AVGX(Y, X)
參數(shù)說明
Y和X:必填,DOUBLE PRECISION、FLOAT或FLOAT8類型表達(dá)式。
返回值說明
與參數(shù)類型一致。
示例
SELECT REGR_AVGX(c6, c7) FROM example_table;
返回結(jié)果如下。
regr_avgx ----------- 4.8
REGR_AVGY
描述:計算因變量(Y)的平均值。
REGR_AVGY(Y, X)
參數(shù)說明
Y和X:必填,DOUBLE PRECISION、FLOAT或FLOAT8類型表達(dá)式。
返回值說明
與參數(shù)類型一致。
示例
SELECT REGR_AVGY(c6, c7) FROM example_table;
返回結(jié)果如下。
regr_avgy ----------- 6
REGR_COUNT
描述:計算輸入?yún)?shù)中都不為空的行數(shù)。
REGR_COUNT(Y, X)
參數(shù)說明
Y和X:必填,DOUBLE PRECISION、FLOAT或FLOAT8類型表達(dá)式。
返回值說明
返回BIGINT類型。
示例
SELECT REGR_COUNT(c6, c7) FROM example_table;
返回結(jié)果如下。
regr_count ------------ 2
REGR_R2
描述:計算相關(guān)系數(shù)的平方。
REGR_R2(Y, X)
參數(shù)說明
Y和X:必填,DOUBLE PRECISION、FLOAT或FLOAT8類型表達(dá)式。
返回值說明
與參數(shù)類型一致。
示例
SELECT REGR_R2(c6, c7) FROM example_table;
返回結(jié)果如下。
regr_r2 --------- 1
REGR_INTERCEPT
描述:計算由
(Y, X)
確定的最小方差擬合的縱軸截距。REGR_INTERCEPT(Y, X)
參數(shù)說明
Y和X:必填,DOUBLE PRECISION、FLOAT或FLOAT8類型表達(dá)式。
返回值說明
與參數(shù)類型一致。
示例
SELECT REGR_INTERCEPT(c6, c7) FROM example_table;
返回結(jié)果如下。
regr_intercept ---------------- 6
REGR_SLOPE
描述:計算最小方差擬合的斜率。
REGR_SLOPE(Y, X)
參數(shù)說明
Y和X:必填,DOUBLE PRECISION、FLOAT或FLOAT8類型表達(dá)式。
返回值說明
與參數(shù)類型一致。
示例
SELECT REGR_SLOPE(c6, c7) FROM example_table;
返回結(jié)果如下。
regr_slope ---------------------- 7.34031751818285e-16
REGR_SXX
描述:計算自變量(X)的平方和,即
sum(X^2) - sum(X)^2/N
。REGR_SXX(Y, X)
參數(shù)說明
Y和X:必填,DOUBLE PRECISION、FLOAT或FLOAT8類型表達(dá)式。
返回值說明
與參數(shù)類型一致。
示例
SELECT REGR_SXX(c6, c7) FROM example_table;
返回結(jié)果如下。
regr_sxx ---------- 9.68
REGR_SXY
描述:計算自變量(X)和因變量(Y)的乘積和,即
sum(X*Y) - sum(X) * sum(Y)/N
。REGR_SXY(Y, X)
參數(shù)說明
Y和X:必填,DOUBLE PRECISION、FLOAT或FLOAT8類型表達(dá)式。
返回值說明
與參數(shù)類型一致。
示例
SELECT REGR_SXY(c6, c7) FROM example_table;
返回結(jié)果如下。
regr_sxy -------------------- 7.105427357601e-15
SUM
描述:獲取BIGINT、FLOAT8、FLOAT4、INT或NUMERIC類型表達(dá)式所有值的總和。
SUM(expression)
參數(shù)說明
expression:必填,BIGINT、FLOAT8、FLOAT4、INT或NUMERIC類型表達(dá)式。
返回值說明
與參數(shù)類型一致。
示例
SELECT SUM(c1) FROM example_table;
返回結(jié)果如下。
sum ----- 3
STDDEV
描述:計算INT、NUMERIC或FLOAT8類型表達(dá)式的樣本標(biāo)準(zhǔn)差。
STDDEV(expression)
參數(shù)說明
expression:必填,INT、NUMERIC或FLOAT8類型表達(dá)式。
返回值說明
返回NUMERIC或FLOAT8類型。
示例
SELECT STDDEV(c1) FROM example_table;
返回結(jié)果如下。
stddev -------------- 0.7071067811
STDDEV_POP
描述:計算INT、NUMERIC或FLOAT8類型表達(dá)式的總體標(biāo)準(zhǔn)差。
STDDEV_POP(expression)
參數(shù)說明
expression:必填,INT、NUMERIC或FLOAT8類型表達(dá)式。
返回值說明
返回NUMERIC或FLOAT8類型。
示例
SELECT STDDEV_POP(c1) FROM example_table;
返回結(jié)果如下。
stddev_pop -------------- 0.5000000000
STDDEV_SAMP
描述:計算INT、NUMERIC、FLOAT8類型表達(dá)式的樣本標(biāo)準(zhǔn)差。
STDDEV_SAMP(expression)
參數(shù)說明
expression:必填,INT、NUMERIC、FLOAT8類型表達(dá)式。
返回值說明
返回NUMERIC或FLOAT8類型。
示例
SELECT STDDEV_SAMP(c1) FROM example_table;
返回結(jié)果如下。
stddev_samp -------------- 0.7071067812
STRING_AGG
描述:將TEXT類型表達(dá)式中的非空值使用指定分隔符串聯(lián)成字符串。
STRING_AGG(<expression> TEXT, <delimiter> TEXT)
參數(shù)說明
expression:必填,原始字符串。
delimiter:必填,分隔符。
返回值說明
返回TEXT類型。
示例
SELECT STRING_AGG(c5, '-') FROM example_table;
返回結(jié)果如下。
string_agg ------------ 3-4
UNIQ
描述:用于計算某一列去重后的行數(shù)。
UNIQ ( < column > );
參數(shù)說明
column:必填,需要計算去重后行數(shù)的列。支持SMALLINT、INTEGER、BIGINT、REAL、DOUBLE PRECISION、TEXT、VARCHAR、TIMESTAMP、TIMESTAMPTZ、DATE、TIMETZ、UUID類型。
使用說明
僅Hologres V1.3及以上版本支持使用UNIQ函數(shù)。
說明如果您的實例是V1.3以下版本,請您使用自助升級或加入Hologres釘釘交流群反饋,詳情請參見如何獲取更多的在線支持?。
SQL中必須包含GROUP BY,且GROUP BY的字段比較均勻(不傾斜),UNIQ才能發(fā)揮比COUNT DISTINCT更好的性能。
正常情況下,UNIQ在GROUP BY KEY的KEY基數(shù)較高時,比COUNT DISTINCT性能更好,同時UNIQ比COUNT DISTINCT更節(jié)省內(nèi)存,如果使用COUNT DISTINCT遇到內(nèi)存超限時,可以換用UNIQ。
從Hologres V2.1版本開始,Hologres針對COUNT DISTINCT場景做了非常多的性能優(yōu)化(包括單個COUNT DISTINCT、多個COUNT DISTINCT、數(shù)據(jù)傾斜、SQL沒有GROUP BY字段等場景),無需再手動改寫成UNIQ實現(xiàn),即可實現(xiàn)更好的性能。詳情請參見Count Distinct優(yōu)化。
示例
以下示例使用MaxCompute提供的公開數(shù)據(jù)集TPC-H的ORDERS表。您無需進(jìn)行任何額外準(zhǔn)備,只需運行以下SQL語句。
-- 創(chuàng)建外部表 IMPORT FOREIGN SCHEMA public_data LIMIT TO (ORDERS_10g) FROM SERVER odps_server INTO public options (if_table_exist 'update'); -- 創(chuàng)建內(nèi)部表 BEGIN; CREATE TABLE ORDERS ( O_ORDERKEY bigint NOT NULL PRIMARY KEY, O_CUSTKEY int NOT NULL, O_ORDERSTATUS text NOT NULL, O_TOTALPRICE DECIMAL(12, 2) NOT NULL, O_ORDERDATE timestamptz NOT NULL, O_ORDERPRIORITY text NOT NULL, O_CLERK text NOT NULL, O_SHIPPRIORITY int NOT NULL, O_COMMENT text NOT NULL ); CALL set_table_property ('ORDERS', 'segment_key', 'O_ORDERDATE'); CALL set_table_property ('ORDERS', 'distribution_key', 'O_ORDERKEY'); CALL set_table_property ('ORDERS', 'bitmap_columns', 'O_ORDERKEY,O_CUSTKEY,O_ORDERSTATUS,O_ORDERPRIORITY,O_CLERK,O_SHIPPRIORITY,O_COMMENT'); CALL set_table_property ('ORDERS', 'dictionary_encoding_columns', 'O_ORDERSTATUS,O_ORDERPRIORITY,O_CLERK,O_COMMENT'); COMMENT ON COLUMN ORDERS.O_ORDERKEY IS '訂單編號'; COMMENT ON COLUMN ORDERS.O_CUSTKEY IS '顧客序號'; COMMENT ON COLUMN ORDERS.O_ORDERSTATUS IS '訂單狀態(tài)'; COMMENT ON COLUMN ORDERS.O_TOTALPRICE IS '總價'; COMMENT ON COLUMN ORDERS.O_ORDERDATE IS '下單日期'; COMMENT ON COLUMN ORDERS.O_ORDERPRIORITY IS '訂單優(yōu)先級'; COMMENT ON COLUMN ORDERS.O_CLERK IS '收銀員'; COMMENT ON COLUMN ORDERS.O_SHIPPRIORITY IS '發(fā)貨優(yōu)先級'; COMMENT ON COLUMN ORDERS.O_COMMENT IS '備注'; COMMIT; -- 數(shù)據(jù)導(dǎo)入內(nèi)表 INSERT INTO ORDERS SELECT * FROM ORDERS_10g;
計算ORDERS表的O_CUSTKEY列去重后行數(shù)。
SELECT UNIQ ( O_CUSTKEY ) FROM ORDERS;
返回結(jié)果如下。
uniq -------- 999982
計算ORDERS表的O_CUSTKEY列,不同O_ORDERSTATUS下O_CUSTKEY去重后行數(shù)。
SELECT O_ORDERSTATUS, UNIQ ( O_CUSTKEY ) FROM ORDERS GROUP BY O_ORDERSTATUS;
返回結(jié)果如下。
o_orderstatus | uniq ---------------+-------- P | 313478 F | 996258 O | 996400
VARIANCE
描述:計算INT、NUMERIC類型表達(dá)式的樣本方差。
VARIANCE(expression)
參數(shù)說明
expression:必填,INT、NUMERIC類型表達(dá)式。
返回值說明
返回NUMERIC類型。
示例
SELECT VARIANCE(c1) FROM example_table;
返回結(jié)果如下。
variance -------------- 0.5000000000
VAR_POP
描述:計算FLOAT8、INT或NUMERIC類型表達(dá)式的總體方差。
VAR_POP(expression)
參數(shù)說明
expression:必填,F(xiàn)LOAT8、INT或NUMERIC類型表達(dá)式。
返回值說明
返回NUMERIC或FLOAT8類型。
示例
SELECT VAR_POP(c1) FROM example_table;
返回結(jié)果如下。
var_pop -------------- 0.2500000000
VAR_SAMP
描述:計算INT、FLOAT8或NUMERIC類型表達(dá)式的樣本方差。
VAR_SAMP(expression)
參數(shù)說明
expression:必填,INT、FLOAT8或NUMERIC類型表達(dá)式。
返回值說明
返回NUMERIC或FLOAT8類型。
示例
SELECT VAR_SAMP(c1) FROM example_table;
返回結(jié)果如下。
var_samp -------------- 0.5000000000