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


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