Udostępnij za pośrednictwem


avg funkcja agregacji

Dotyczy:zaznacz pole wyboru oznaczone jako tak Databricks SQL zaznacz pole wyboru oznaczone jako tak Databricks Runtime

Zwraca średnią obliczoną na podstawie wartości grupy. Ta funkcja jest synonimem mean funkcji agregującej.

Składnia

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

Tę funkcję można również wywołać jako funkcję okna przy użyciu klauzuli OVER .

Argumenty

  • expr: wyrażenie arytmetyczne, które daje w wyniku wartość liczbową lub interwał.
  • cond: opcjonalne wyrażenie logiczne filtrujące wiersze używane do agregacji.

Zwraca

Typ wyniku jest obliczany w taki sam sposób, jak dla argumentów.

  • DECIMAL(p, s): typ wyniku to a DECIMAL(p + 4, s + 4). Jeśli maksymalna precyzja dla DECIMAL zostanie osiągnięta, zwiększenie skali będzie ograniczone, aby uniknąć utraty znaczących cyfr.
  • przedział rok-miesiąc: wynik to INTERVAL YEAR TO MONTH.
  • Przedział czasowy dnia: wynik to INTERVAL DAY TO SECOND.
  • We wszystkich innych przypadkach wynik to DOUBLE.

Wartości null w grupie są ignorowane. Jeśli grupa jest pusta lub składa się tylko z wartości null, wynik to NULL.

Jeśli DISTINCT określono, średnia jest obliczana po usunięciu duplikatów.

Jeśli wynik przepełni typ wyniku, usługa Azure Databricks zgłasza błąd ARITHMETIC_OVERFLOW . Aby zamiast tego zwrócić wartość NULL, użyj try_avg.

Ostrzeżenie

W środowisku Databricks Runtime, jeśli spark.sql.ansi.enabled to false, przepełnienie zwraca NULL zamiast błędu.

Przykłady

> 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