Поделиться через


Агрегатная функция avg

Область применения: флажок Databricks SQL флажок 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