avg 聚合函数

适用于:Databricks SQL check marked yes Databricks Runtime

返回从组的值计算出的平均值。 此函数是 mean 聚合函数的同义词。

语法

avg( [ALL | DISTINCT] expr) [FILTER ( WHERE cond ) ]

还可以使用 OVER 子句将此函数作为窗口函数调用。

参数

  • expr:一个计算结果为数字或间隔的表达式。
  • cond:一个可选的布尔表达式,可筛选用于聚合的行。

返回

结果类型将根据参数计算:

  • DECIMAL(p, s):结果类型为 DECIMAL(p + 4, s + 4)。 如果达到 DECIMAL 的最大精度,则位数的增加将受到限制,以避免丢失有效数字。
  • 年月间隔:结果为 INTERVAL YEAR TO MONTH
  • 日时间间隔:结果为 INTERVAL DAY TO SECOND
  • 在所有其他情况下,结果为 DOUBLE。

将忽略组内的 NULL。 如果组为空或仅包含 NULL,则结果为 NULL。

如果指定了 DISTINCT,则会在删除重复项后计算平均值。

如果结果溢出结果类型,则 Azure Databricks 会引发 ARITHMETIC_OVERFLOW 错误。 要返回 NULL,请改为使用 try_avg

警告

在 Databricks Runtime 中,如果 spark.sql.ansi.enabledfalse,则溢出会返回 NULL 而不是错误。

示例

> SELECT avg(col) FROM VALUES (1), (2), (3) AS tab(col);
 2.0

> SELECT avg(DISTINCT col) FROM VALUES (1), (1), (2) AS tab(col);
 1.5

> SELECT avg(col) FROM VALUES (1), (2), (NULL) AS tab(col);
 1.5

> SELECT avg(col) FROM VALUES (INTERVAL '1' YEAR), (INTERVAL '2' YEAR) AS tab(col);
 1-6

-- Overflow results in NULL for try_avg()
> SELECT try_avg(col) FROM VALUES (5e37::DECIMAL(38, 0)), (5e37::DECIMAL(38, 0)) AS tab(col);
 NULL

-- Overflow causes error for avg() in ANSI mode.
> SELECT avg(col) FROM VALUES (5e37::DECIMAL(38, 0)), (5e37::DECIMAL(38, 0)) AS tab(col);
 Error: CANNOT_CHANGE_DECIMAL_PRECISION