Classe d’erreur MISSING_AGGREGATION
L’expression non-agrégation <expression>
est basée sur des colonnes qui ne participent pas à la clause GROUP BY.
Ajoutez les colonnes ou l'expression à l'GROUP BY, agrégez l'expression, ou utilisez <expressionAnyValue>
si vous ne vous souciez pas de laquelle des valeurs d'un groupe est retournée.
Paramètres
- expression : expression non agrégeante, sans regroupement dans la liste
SELECT
. - expressionAnyValue:
expression
encapsulée dans une fonction d’agrégation any_value().
Explication
Dans le contexte d’une requête avec une clause GROUP BY, les références de colonnes locales dans la liste SELECT doivent être :
- Consommé comme argument à une fonction d’agrégation, ou
- Partie d’une expression qui correspond à une expression sur la clause
GROUP BY
.
Une référence de colonne locale est une colonne qui a été résolue en une référence de table dans la clause FROM de la requête.
En d’autres termes : les références de colonnes doivent faire partie des clés de regroupement ou faire partie de l’agrégation.
Azure Databricks met en correspondance des expressions au mieux. Par exemple, il reconnaîtra SELECT c1 + 5 FROM T GROUP BY 5 + c1
comme des expressions mathématiques.
Mais SELECT c1 FROM T GROUP BY c1 + 5
n’est pas une correspondance.
Atténuation
L’atténuation de l’erreur dépend de la cause :
Avez-vous oublié une colonne de regroupement ?
Ajoutez
expression
ou la sous-expression appropriée deexpression
à la clauseGROUP BY
.La référence de colonne fait-elle partie d’une expression
GROUP BY
qui diffère deepression
?Faites correspondre l’expression dans la liste
SELECT
ou simplifiez l’expressionGROUP BY
.Vous manquez l’agrégation ?
Encapsulez la référence de colonne avec une fonction d’agrégation. Si vous ne souhaitez qu’une valeur représentative du groupe, vous pouvez utiliser any_value(epression).
Exemples
-- Sample data
> CREATE OR REPLACE TEMPORARY VIEW tasks(name, firstname, task, cost) AS
VALUES ('Smith' , 'Sam' , 'UNPIVOT', 10),
('Smith' , 'Sam' , 'LATERAL', 5),
('Shuster', 'Sally' , 'DELETE' , 7),
('Shuster', 'Sally' , 'GRANT' , 8);
-- `name` and `firstname` are part of the group by coumns, but incomplete
> SELECT name, firstname, sum(cost) FROM tasks GROUP BY firstname || ' ' || name;
[MISSING_AGGREGATION] The expression "name" is neither present in the group by, nor is it an aggregate function.
-- Match the GROUP BY expression
> SELECT firstname || ' ' || name, sum(cost) FROM tasks GROUP BY firstname || ' ' || name;
Sam Smith 15
Sally Shuster 15
-- Break up the GROUP BY expression
> SELECT firstname, name, sum(cost) FROM tasks GROUP BY firstname, name;
Sam Smith 15
Sally Shuster 15
-- Missing grouping column
> SELECT name, firstname, sum(cost) FROM tasks GROUP BY name;
[MISSING_AGGREGATION] The expression "firstname" is neither present in the group by, nor is it an aggregate function.
-- Add the grouping column
> SELECT firstname, name, sum(cost) FROM tasks GROUP BY firstname, name;
Sam Smith 15
Sally Shuster 15
-- Missing aggregate
> SELECT firstname, name, sum(cost), task FROM tasks GROUP BY firstname, name;
[MISSING_AGGREGATION] The expression "task" is neither present in the group by, nor is it an aggregate function.
-- Add an aggregate
> SELECT firstname, name, sum(cost), array_agg(task) FROM tasks GROUP BY firstname, name;
Sam Smith 15 ["UNPIVOT","LATERAL"]
Sally Shuster 15 ["DELETE","GRANT"]
-- Return any task
> SELECT firstname, name, sum(cost), any_value(task) FROM tasks GROUP BY firstname, name;
Sam Smith 15 LATERAL
Sally Shuster 15 DELETE