classe de erro MISSING_AGGREGATION
A expressão <expression>
não agregada baseia-se em colunas que não estão a participar na cláusula GROUP BY.
Adicione as colunas ou a expressão a GROUP BY, agregue a expressão ou utilize <expressionAnyValue>
se não se importar com quais dos valores dentro de um grupo são devolvidos.
Parâmetros
-
expressão: expressão não agregada, não agrupado na
SELECT
lista. -
expressionAnyValue:
expression
moldado numa função de agregação any_value().
Explicação
No contexto de uma consulta com uma cláusula GROUP BY , as referências de colunas locais na lista SELECT têm de ser:
- Consumido como um argumento para uma função de agregação ou
- Parte de uma expressão que corresponde a uma expressão na
GROUP BY
cláusula .
Uma referência de coluna local é uma coluna que foi resolvida para uma referência de tabela na cláusula FROM da consulta.
Por outras palavras: as referências de coluna têm de fazer parte das chaves de agrupamento ou têm de fazer parte da agregação.
O Azure Databricks corresponde a expressões no melhor esforço: por exemplo, irá reconhecer: SELECT c1 + 5 FROM T GROUP BY 5 + c1
como expressões matemáticas.
Mas SELECT c1 FROM T GROUP BY c1 + 5
não é uma correspondência.
Mitigação
A mitigação do erro depende da causa:
Perdeu uma coluna de agrupamento?
Adicione
expression
ou a subexpressão relevante deexpression
àGROUP BY
cláusula .A referência da coluna é parte de uma
GROUP BY
expressão que difere deepression
?Corresponda à expressão na
SELECT
lista ou simplifique aGROUP BY
expressão.Falta-lhe a agregação?
Moldar a referência de coluna com uma função de agregação. Se quiser apenas um valor representativo do grupo, pode utilizar any_value(epression).
Exemplos
-- 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