联 系 我 们
售前咨询
售后咨询
微信关注:星环科技服务号
更多联系方式 >
6.8.11.14 聚合/分析函数
更新时间:7/30/2024, 3:36:32 AM
avg
函数语法 返回类型 描述

avg(expr)

DOUBLE

计算并返回表达式的平均值。

参数说明

  • expr:指定用于计算的表达式,支持对字符串类型的数字进行隐性转换。

使用示例:

SELECT avg(price) AS result FROM transactions;
复制

返回示例:

+----------+
|  result  |
+----------+
| 12.3295  |
+----------+
复制
collect_set
函数语法 返回类型 描述

collect_set(expr)

ARRAY

从输入值中创建一个集合,包含不同的值,从而实现去重的效果。

参数说明

  • expr:指定用于计算的表达式。

使用示例:

从一个表中的多列中创建一个包含不同值的集合。

SELECT collect_set(amount) AS result
FROM transactions;
复制

返回示例:

+-------------------------------------------------------+
|                        result                         |
+-------------------------------------------------------+
| [800,400,500,100,1300,900,200,1000,600,1100,300,700]  |
+-------------------------------------------------------+
复制
compute_stats
函数语法 返回类型 描述

compute_stats(expr)

STRUCT

返回一组基本类型值的统计摘要。

参数说明

  • expr:指定用于统计的表达式。

使用示例:

查看 transactions 表中,成交单价(price)的统计摘要信息,包含列类型、最小值、最大值、空值数量等信息。

SELECT compute_stats(price) AS result
FROM transactions;
复制

返回示例:

+---------------------------------------------------------------------------------------+
|                                        result                                         |
+---------------------------------------------------------------------------------------+
| {"columntype":"Double","min":4.16,"max":68.43,"countnulls":0,"numdistinctvalues":20}  |
+---------------------------------------------------------------------------------------+
复制
count
函数语法 返回类型 描述

count(expr)

INTEGER

统计由表达式定义的行数量。

参数说明

  • expr:指定用于统计的表达式,当设置为列名时,则仅计算该列中非 NULL 值的行数。

使用示例:

SELECT count(*) AS result
FROM transactions;
复制

返回示例:

+---------+
| result  |
+---------+
| 20      |
+---------+
复制
covar_pop
函数语法 返回类型 描述

covar_pop(expr1, expr2)

DOUBLE

返回两列数值的总体协方差,计算公式:当 expr1 和 expr2 都不为 NULL 时,(SUM(expr1*expr2)-SUM(expr1)*SUM(expr2)/COUNT(expr1,expr2))/COUNT(expr1,expr2),否则返回 NULL。

参数说明

  • expr1expr2:分别指定用于计算的一对表达式。

使用示例

SELECT covar_pop(price,amount) AS result
FROM transactions;
复制

返回示例

+----------------------+
|        result        |
+----------------------+
| -1740.9275000000002  |
+----------------------+
复制
covar_samp
函数语法 返回类型 描述

covar_samp(expr1, expr2)

DOUBLE

返回两列数值的样本协方差,计算公式:当 expr1 和 expr2 都不为 NULL 时,(SUM(expr1*expr2)-SUM(expr1)*SUM(expr2)/COUNT(expr1,expr2))/(COUNT(expr1,expr2)-1),否则返回 NULL。

参数说明

  • expr1expr2:分别指定用于计算的一对表达式。

使用示例

SELECT covar_samp(price,amount) AS result
FROM transactions;
复制

返回示例

+----------------------+
|        result        |
+----------------------+
| -1832.5552631578948  |
+----------------------+
复制
csum
函数语法 返回类型 描述

csum(expr, order_expr)

与 expr 相同,字符串会转换为 DOUBLE

计算并返回表达式的连续累计值,同时支持排序。

参数说明

  • expr:指定用于统计的表达式。

  • order_expr:可选,指定排序的表达式(如列名),支持的排序方式为 ASC(升序,默认)或 DESC(降序)。

使用示例

由于该函数属于 Teradata 方言,我们需要先设置服务器方言为 Teradata,同时为避免因建表方言不一致引发数据读取报错,我们还需要跳过查询时的方言检查,具体流程如下:

-- 设置方言为 Teradata
set server.dialect=td;

-- 跳过方言检查
set argodb.ignore.dialect.enabled=true;

-- 使用 scum 函数
SELECT trans_type, csum(price,trans_type ASC)  AS result
FROM transactions;
复制

返回示例

+-------------+---------------------+
| trans_type  |       result        |
+-------------+---------------------+
| b           | 6.36                |
| b           | 74.79               |
| b           | 85.9                |
| b           | 91.15               |
| b           | 98.17               |
| b           | 110.3               |
| b           | 128.68              |
| b           | 138.49              |
| s           | 148.8               |
| s           | 153.3               |
| s           | 159.42000000000002  |
| s           | 168.58              |
| s           | 176.07000000000002  |
| s           | 186.10000000000002  |
| s           | 208.76000000000002  |
| s           | 212.92000000000002  |
| s           | 220.44000000000003  |
| s           | 225.74000000000004  |
| s           | 237.95000000000005  |
| s           | 246.59000000000003  |
+-------------+---------------------+
复制
corr
函数语法 返回类型 描述

corr(expr1, expr2)

STRING

计算并返回两个表达式的皮尔逊相关系数。

参数说明

  • expr1expr2:分别指定用于计算的一对表达式。

使用示例

SELECT corr(price,amount) AS result
FROM transactions;
复制

返回示例

+-----------------------+
|        result         |
+-----------------------+
| -0.34113419294612246  |
+-----------------------+
复制
ewah_bitmap
函数语法 返回类型 描述

ewah_bitmap(expr)

STRING

返回列的 EWAH 压缩位图表示形式。

参数说明

  • expr:指定用于转换的表达式。

使用示例:

SELECT ewah_bitmap(trans_type) AS result
FROM transactions;
复制

返回示例:

+--------------+
|    result    |
+--------------+
| [0,1,4,0,0]  |
+--------------+
复制
histogram_numeric
函数语法 返回类型 描述

histogram_numeric(expr, int)

ARRAY

以 int 为基准计算表达式的直方图信息。

参数说明

  • expr:指定用于计算的表达式。

  • int:指定一个整数作为基准。

使用示例

SELECT histogram_numeric(price,2) AS result
FROM transactions;
复制

返回示例

+---------------------------------------------------------+
|                         result                          |
+---------------------------------------------------------+
| [{"x":9.376842105263158,"y":19.0},{"x":68.43,"y":1.0}]  |
+---------------------------------------------------------+
复制
kurtosis
函数语法 返回类型 描述

kurtosis(express)

DOUBLE

计算一组数值的峰度值,用于度量数据分布相对于正态分布的尖锐程度。峰度值大于 0 表示数据分布比正态分布更尖锐,峰度值小于 0 表示数据分布比正态分布更平坦,峰度值等于 0 表示数据分布与正态分布相似。

参数说明

  • expr:指定用于计算峰度值的表达式。

使用示例:

计算 transactions 表中,成交单价(price)的峰度值。

SELECT kurtosis(price) AS result
FROM transactions;
复制

返回示例:

+---------------------+
|       result        |
+---------------------+
| 15.306714699109587  |
+---------------------+
复制
max
函数语法 返回类型 描述

max(expr)

与 expr 类型相同

返回表达式中的最大值。

参数说明

  • expr:指定用于计算的表达式。

使用示例

SELECT max(price) AS result
FROM transactions;
复制

返回示例

+---------+
| result  |
+---------+
| 68.43   |
+---------+
复制
mavg
函数语法 返回类型 描述

mave(expr,n,sort_expr)

与 expr 相同,字符串会转换为 FLOAT

基于指定的行数(查询宽度)计算一列的移动平均值。如果行数小于这个宽度,则基于前面已有的行计算平均值。

参数说明

  • expr:指定用于统计的表达式。

  • n:查询宽度,即计算中要使用的先前行数,取值范围 1 ~ 4096。

  • order_expr:可选,指定排序的表达式(如列名),支持的排序方式为 ASC(升序,默认)或 DESC(降序)。

使用示例

由于该函数属于 Teradata 方言,我们需要先设置服务器方言为 Teradata,同时为避免因建表方言不一致引发数据读取报错,我们还需要跳过查询时的方言检查,具体流程如下:

-- 设置方言为 Teradata
set server.dialect=td;

-- 跳过方言检查
set argodb.ignore.dialect.enabled=true;

-- 使用 mavg 函数
SELECT STR_TO_DATE(substr(trans_time, 1, 8),'yyyyMMdd') date,
    price,
    mavg(price,7,trans_time)
    AS result
FROM transactions LIMIT 6;
复制

返回示例

+-------------+--------+---------------------+
|    date     | price  |       result        |
+-------------+--------+---------------------+
| 2014-01-05  | 12.13  | 12.13               |
| 2014-02-05  | 11.11  | 11.620000000000001  |
| 2014-02-14  | 4.16   | 9.133333333333335   |
| 2014-02-28  | 9.16   | 9.14                |
| 2014-03-14  | 10.31  | 9.374               |
| 2014-03-15  | 22.66  | 11.588333333333333  |
+-------------+--------+---------------------+
复制
mdiff
函数语法 返回类型 描述

mdiff(expr,n,sort_expr)

与 expr 相同,字符串会转换为 DOUBLE

基于指定的查询宽度计算一列的移动差分值。

参数说明

  • expr:指定用于统计的表达式。

  • n:查询宽度,即计算中要使用的先前行数,取值范围 1 ~ 4096。

  • order_expr:可选,指定排序的表达式(如列名),支持的排序方式为 ASC(升序,默认)或 DESC(降序)。

使用示例

由于该函数属于 Teradata 方言,我们需要先设置服务器方言为 Teradata,同时为避免因建表方言不一致引发数据读取报错,我们还需要跳过查询时的方言检查,具体流程如下:

-- 设置方言为 Teradata
set server.dialect=td;

-- 跳过方言检查
set argodb.ignore.dialect.enabled=true;

-- 使用 mavg 函数
SELECT STR_TO_DATE(substr(trans_time, 1, 8),'yyyyMMdd') date,amount,mdiff(amount,1,trans_time) AS result FROM transactions LIMIT 6;
复制

返回示例

+-------------+---------+---------+
|    date     | amount  | result  |
+-------------+---------+---------+
| 2014-01-05  | 200     | NULL    |
| 2014-02-05  | 300     | 100     |
| 2014-02-14  | 600     | 300     |
| 2014-02-28  | 100     | -500    |
| 2014-03-14  | 400     | 300     |
| 2014-03-15  | 200     | -200    |
+-------------+---------+---------+
复制
min
函数语法 返回类型 描述

min(expr)

与 expr 类型相同

返回表达式中的最小值。

参数说明

  • expr:指定用于计算的表达式。

使用示例

SELECT min(price) AS result
FROM transactions;
复制

返回示例

+---------+
| result  |
+---------+
| 4.16    |
+---------+
复制
percentile
函数语法 返回类型 描述

percentile(expr, p)

DOUBLE Array<Double>

返回位于组中指定位置处表达式的确切百分位值。

参数说明

  • expr:指定用于计算的表达式,值的类型为 BIGINT 或 INT,如果表达式为单值,则跳过计算,直接返回该值。

  • p:指定要计算百分位值的位置,范围为 0~1 的数值表达式,支持数组形式,格式为 array(p1,p2…​),不支持浮点型数值。

使用示例(非数组)

SELECT percentile(amount, 0.2) AS result
FROM transactions;
复制

返回示例

+---------------------+
|       result        |
+---------------------+
| 180.00000000000003  |
+---------------------+
复制

使用示例(数组)

SELECT percentile(amount, array(0.2,0.8)) AS result
FROM transactions;
复制

返回示例

+-----------------------------------------+
|                 result                  |
+-----------------------------------------+
| [180.00000000000003,920.0000000000002]  |
+-----------------------------------------+
复制
percentile_approx
函数语法 返回类型 描述

percentile_approx(expr, p [, accuracy])

DOUBLE Array<Double>

返回组中数值列(包括浮点类型)的近似第 p 个百分位数,返回值为 DOUBLE 或数组。

参数说明

  • expr:指定用于计算的表达式。

  • p:指定要计算百分位值的位置,取值范围为:(0,1),即不包含 0 和 1,传入一组数值可同时计算多个分位数的近似值,格式为 array(p1,p2…​)

  • accuracy:该参数以内存为代价控制近似精度,值越高,产生的近似值越好,默认值为 10,000,当 expr 中的非重复值的数量小于本参数的值时,会返回一个精确的百分位值。

使用示例(非数组)

计算 transactions 表中,成交单价(price)的第一四分位数。

SELECT percentile_approx(price, 0.25, 10000) AS result
FROM transactions;
复制

返回示例

+---------+
| result  |
+---------+
| 6.12    |
+---------+
复制

使用示例(数组):

计算 transactions 表中,成交单价(price)的第一四分位数和中位数。

SELECT percentile_approx(price, array(0.25, 0.5), 10000) AS result
FROM transactions;
复制

返回示例:

+--------------+
|    result    |
+--------------+
| [6.12,8.64]  |
+--------------+
复制
percentile_cont
函数语法 返回类型 描述
percentile_cont(<expr>) WITHIN GROUP (
  ORDER BY <order_expr>
) OVER([PARTITION BY <partition_expr>])
复制

DOUBLE

返回一个连续的百分位数,该函数将按照给定的排序顺序计算指定百分位数的值。

参数说明

  • <expr>:百分位数的值。取值范围为 [0, 1],表示所要计算的分位数,例如 0.5 表示中位数,0.25 表示第一四分位数。

  • <order_expr>:可选,指定排序的表达式(如列名),支持的排序方式为 ASC(升序,默认)或 DESC(降序)。

  • <partition_expr>:可选,指定参与分区的表达式。

使用示例

transactions 表中,以连续的方式分别计算各交易类型(trans_type)的成交单价(price)的中位数。

SELECT trans_type,
         percentile_cont(0.5) WITHIN GROUP (
ORDER BY price ASC) OVER(PARTITION BY trans_type) AS median_price
FROM transactions;
复制

返回示例

+-------------+---------------+
| trans_type  | median_price  |
+-------------+---------------+
| s           | 8.08          |
| s           | 8.08          |
| s           | 8.08          |
| s           | 8.08          |
| s           | 8.08          |
| s           | 8.08          |
| s           | 8.08          |
| s           | 8.08          |
| s           | 8.08          |
| s           | 8.08          |
| s           | 8.08          |
| s           | 8.08          |
| b           | 10.46         |
| b           | 10.46         |
| b           | 10.46         |
| b           | 10.46         |
| b           | 10.46         |
| b           | 10.46         |
| b           | 10.46         |
| b           | 10.46         |
+-------------+---------------+
复制
percentile_disc
函数语法 返回类型 描述
percentile_disc(expr) WITHIN GROUP (
  ORDER BY
    order_expr
) OVER([PARTITION BY partition_expr])
复制

Double

返回一个离散的百分位数,该函数返回一个最接近指定百分位数的实际数据值,返回类型与输入值类型一致。如果没有对应的数据值,就取大于该分布值的下一个值。

参数说明

  • expr:百分位数的值。取值范围为 [0, 1],表示所要计算的分位数,例如 0.5 表示中位数,0.25 表示第一四分位数。

  • order_expr:可选,指定排序的表达式(如列名),支持的排序方式为 ASC(升序,默认)或 DESC(降序)。

  • partition_expr:可选,指定参与分区的表达式。

使用示例

transactions 表中,以离散的方式分别计算各交易类型(trans_type)的成交单价(price)的中位数。

SELECT trans_type,
         percentile_disc(0.5) WITHIN GROUP (
ORDER BY price) OVER(PARTITION BY trans_type) AS median_price
FROM transactions;
复制

返回示例

+-------------+---------------+
| trans_type  | median_price  |
+-------------+---------------+
| s           | 7.52          |
| s           | 7.52          |
| s           | 7.52          |
| s           | 7.52          |
| s           | 7.52          |
| s           | 7.52          |
| s           | 7.52          |
| s           | 7.52          |
| s           | 7.52          |
| s           | 7.52          |
| s           | 7.52          |
| s           | 7.52          |
| b           | 9.81          |
| b           | 9.81          |
| b           | 9.81          |
| b           | 9.81          |
| b           | 9.81          |
| b           | 9.81          |
| b           | 9.81          |
| b           | 9.81          |
+-------------+---------------+
复制
quantile
函数语法 返回类型 描述

quantile(int, order_expr)

与源数据类型相同

将一组记录划分为多个大小大致相等的分区。

参数说明

  • int:指定分位数分区数量。

  • order_expr:可选,指定排序的表达式(如列名),支持的排序方式为 ASC(升序,默认)或 DESC(降序)。

使用示例

由于该函数属于 Teradata 方言,我们需要先设置服务器方言为 Teradata,同时为避免因建表方言不一致引发数据读取报错,我们还需要跳过查询时的方言检查,具体流程如下:

-- 设置方言为 Teradata
set server.dialect=td;

-- 跳过方言检查
set argodb.ignore.dialect.enabled=true;

-- 使用 scum 函数
SELECT STR_TO_DATE(substr(trans_time, 1, 8),'yyyyMMdd') date,
    price,
    amount,
    quantile(10,amount) AS result
FROM transactions;
复制

返回示例

+-------------+--------+---------+---------+
|    date     | price  | amount  | result  |
+-------------+--------+---------+---------+
| 2014-02-28  | 9.16   | 100     | 0       |
| 2014-06-28  | 7.02   | 100     | 0       |
| 2014-05-06  | 6.12   | 100     | 0       |
| 2014-03-28  | 68.43  | 100     | 0       |
| 2014-03-15  | 22.66  | 200     | 2       |
| 2014-01-05  | 12.13  | 200     | 2       |
| 2014-06-11  | 5.3    | 200     | 2       |
| 2014-02-05  | 11.11  | 300     | 3       |
| 2014-03-14  | 10.31  | 400     | 4       |
| 2014-10-31  | 12.21  | 500     | 4       |
| 2014-09-16  | 9.81   | 500     | 4       |
| 2014-02-14  | 4.16   | 600     | 5       |
| 2014-05-08  | 18.38  | 700     | 6       |
| 2014-03-31  | 10.03  | 800     | 6       |
| 2014-08-01  | 6.36   | 800     | 6       |
| 2014-11-30  | 8.64   | 900     | 7       |
| 2014-04-30  | 5.25   | 1000    | 8       |
| 2014-04-30  | 4.5    | 1000    | 8       |
| 2014-12-25  | 7.49   | 1100    | 9       |
| 2014-07-02  | 7.52   | 1300    | 9       |
+-------------+--------+---------+---------+
复制
skew
函数语法 返回类型 描述

skew(expr)

DOUBLE

计算一组数值的偏度值,用于衡量数据分布的对称性,对于含有 NULL 值的数据,将被忽略。正偏度表示尾部向右延伸的分布;负偏度表示尾部向左延伸的分布。

参数说明

  • expr:指定要计算的表达式。

使用示例:

transactions 表中,计算成交单价(price)的偏度值。

SELECT skew(price) AS result
FROM transactions;
复制

返回示例:

+--------------------+
|       result       |
+--------------------+
| 3.758271312419232  |
+--------------------+
复制
std/stddev/stddev_pop
函数语法 返回类型 描述

std([DISTINCT] expr)

stddev([DISTINCT] exrp)

stddev_pop([DISTINCT] expr)

DOUBLE

返回表达式的总体标准差。

参数说明

  • DISTINCT:是否在计算前去除重复值。

  • expr:指定用于统计的表达式,如果只有一个值则返回 0.0。

使用示例

SELECT std(DISTINCT price) AS result
FROM transactions;
复制

返回示例

+---------------------+
|       result        |
+---------------------+
| 13.616199717615782  |
+---------------------+
复制
stddev_samp
函数语法 返回类型 描述

stddev_samp([DISTINCT] expr)

DOUBLE

返回指定列的样本标准差。

参数说明

  • DISTINCT:是否在计算前去除重复值。

  • expr:指定用于统计的表达式,如果只有一个值则返回 0.0。

使用示例

SELECT stddev_samp(DISTINCT amount) AS result
FROM transactions;
复制

返回示例

+---------------------+
|       result        |
+---------------------+
| 375.27767497325675  |
+---------------------+
复制
sum
函数语法 返回类型 描述

sum(expr)

INTEGER

返回表达式的求和结果。

参数说明

  • expr:指定用于统计的表达式。

使用示例

SELECT sum(amount) AS result
FROM transactions;
复制

返回示例

+---------+
| result  |
+---------+
| 10900   |
+---------+
复制
variance/var_pop
函数语法 返回类型 描述
  • variance([DISTINCT] expr)

  • var_pop([DISTINCT] expr)

DOUBLE

返回表达式的总体方差。

参数说明

  • DISTINCT:是否在计算前去除重复值。

  • expr:指定用于统计的表达式,如果只有一个值则返回 0.0。

使用示例

SELECT variance(DISTINCT amount) AS result_variance, var_pop(amount) AS result_varpop FROM transactions;
复制

返回示例

+---------------------+----------------+
|   result_variance   | result_varpop  |
+---------------------+----------------+
| 129097.22222222223  | 140475.0       |
+---------------------+----------------+
复制
var_samp
函数语法 返回类型 描述

var_samp(expr)

DOUBLE

返回表达式的样本方差。

参数说明

  • expr:指定用于统计的表达式,如果只有一个值则返回 0.0。

使用示例

SELECT var_samp(amount) AS result
FROM transactions;
复制

返回示例

+---------------------+
|       result        |
+---------------------+
| 147868.42105263157  |
+---------------------+
复制
wd_concat
函数语法 返回类型 描述

wd_concat(expr)

STRING

将表达式中的字符串合并为一条记录。

参数说明

  • expr:指定要合并字符串的表达式。

使用示例 1:

将用户信息表(user_info)中,账号等级(acc_level)列中的所有值合并为一条记录。

SELECT wd_concat(acc_level) AS result
FROM user_info;
复制

返回示例 1:

+-------------+
|   result    |
+-------------+
| CCEDAACDAB  |
+-------------+
复制

使用示例 2:

user_info 表中,按照账户等级(acc_level)分区,以注册日期(reg_date)降序的顺序拼接用户姓名(name)。

SELECT reg_date, acc_level, wd_concat(name)
    OVER ( PARTITION BY acc_level
ORDER BY  reg_date DESC ) "concat"
FROM user_info;
复制

返回示例 2:

+-----------+------------+------------+
| reg_date  | acc_level  |   concat   |
+-----------+------------+------------+
| 20121024  | A          | **        |
| 20110101  | A          | ****     |
| 20091202  | A          | ******  |
| 20080214  | B          | **        |
| 20141003  | C          | **        |
| 20110430  | C          | ****     |
| 20100101  | C          | ******  |
| 20110916  | D          | **        |
| 20081031  | D          | ****     |
| 20130702  | E          | **        |
+-----------+------------+------------+
复制
xmlagg
函数语法 返回类型 描述

xmlagg(expr)

STRING

获取一组 XML 片段并返回一个聚合的 XML 文档,输出结果时不会包含 XML 的元素标记。

参数说明

  • expr:指定要聚合的表达式。

使用示例:

将用户信息表(user_info)中,账号等级(acc_level)列中的所有值合并为一条记录。

如需在输出结果带上 XML 元素标记,可在 xmlagg 中嵌套使用 xmlforest 函数,例如:SELECT xmlagg(xmlforest(acc_level)) AS result FROM user_info;

SELECT xmlagg(acc_level) AS result
FROM user_info;
复制

返回示例:

+-------------+
|   result    |
+-------------+
| CDCCBADAAE  |
+-------------+
复制