Fonction d’agrégation avg
S’applique à : Databricks SQL Databricks Runtime
Retourne la moyenne calculée à partir des valeurs d’un groupe. Cette fonction est synonyme de la fonction d'agrégation mean.
Syntaxe
avg( [ALL | DISTINCT] expr) [FILTER ( WHERE cond ) ]
Cette fonction peut également être appelée en tant que fonction de fenêtre à l’aide de la clause OVER
.
Arguments
expr
: expression qui prend une valeur numérique ou intervalle (INTERVAL).cond
: expression booléenne facultative qui filtre les lignes utilisées pour l’agrégation.
Retours
Le type de résultat est calculé comme pour les arguments :
DECIMAL(p, s)
: le type de résultat estDECIMAL(p + 4, s + 4)
. Si la précision maximale de DECIMAL est atteinte, l’augmentation de l’échelle sera limitée pour éviter la perte de chiffres significatifs.- Intervalle d’année-mois : le résultat est
INTERVAL YEAR TO MONTH
. - intervalle de jour-heure : le résultat est
INTERVAL DAY TO SECOND
. - Dans tous les autres cas, le résultat est une valeur DOUBLE.
Les valeurs Null au sein du groupe sont ignorées. Si un groupe est vide ou comprend uniquement des valeurs Null, le résultat est NULL.
Si DISTINCT
est spécifié, la moyenne est calculée après la suppression des doublons.
Si le résultat dépasse le type de résultat, Azure Databricks déclenche une erreur ARITHMETIC_OVERFLOW. Pour retourner une valeur NULL à la place, utilisez try_avg.
Avertissement
Dans Databricks Runtime, si spark.sql.ansi.enabled a la valeur false
, un dépassement de capacité retourne NULL
au lieu d’une erreur.
Exemples
> 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