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


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

Область применения:флажок Databricks SQL флажок Databricks Runtime 11.3 LTS и выше

Возвращает среднее значение, вычисляемое из значений группы. При переполнении возвращает значение NULL.

Синтаксис

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

Эту функцию также можно вызвать как функцию окна с помощью предложения OVER.

Аргументы

  • expr: выражение, возвращающее числовое или интервальное значение.
  • cond: необязательное логическое выражение для фильтрации строк, используемых для агрегирования.

Возвраты

Тип результата определяется на основе аргументов:

  • DECIMAL(p, s): результат имеет тип DECIMAL(p + 4, s + 4). Если достигнута максимальная точность для типа DECIMAL, увеличение масштаба ограничивается так, чтобы избежать потери значащих цифр.
  • Результат для интервала "год-месяц" — это INTERVAL YEAR TO MONTH.
  • дневной интервал: результат это INTERVAL YEAR TO SECOND.
  • Во всех остальных случаях результатом является значение DOUBLE.

Значения NULL внутри группы игнорируются. Если группа является пустой или состоит только из значений NULL, результат NULL.

Если указано значение DISTINCT, вычисляется среднее значение после удаления дубликатов.

Чтобы отобразить ошибку вместо значения NULL в случае переполнения, используйте функцию avg.

Примеры

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

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

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

> SELECT try_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