Агрегатная функция 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