Clase de error MISSING_AGGREGATION
La expresión no agregada <expression>
se basa en columnas que no participan en la cláusula GROUP BY.
Agregue las columnas o la expresión a GROUP BY, agregue la expresión, o use <expressionAnyValue>
si no importa cuál de los valores de un grupo se devuelve.
Parámetros
- expression: expresión de no agregación y no agrupación en la lista
SELECT
. - expressionAnyValue:
expression
encapsulado en una función de agregado any_value().
Explicación
Dentro del contexto de una consulta con una cláusula GROUP BY, las referencias de columna locales de la lista SELECT deben ser:
- Consumirse como argumento de una función de agregado, o bien
- Parte de una expresión que coincide con una expresión en la cláusula
GROUP BY
.
Una referencia de columna local es una columna que se ha resuelto como una referencia de tabla en la cláusula FROM de la consulta.
En otras palabras: las referencias de columna deben formar parte de las claves de agrupación o deben formar parte de la agregación.
Azure Databricks usa la mejor coincidencia para las expresiones; por ejemplo, reconoce SELECT c1 + 5 FROM T GROUP BY 5 + c1
como expresiones matemáticas.
Pero SELECT c1 FROM T GROUP BY c1 + 5
no es una coincidencia.
Mitigación
La mitigación del error depende de la causa:
¿Ha perdido una columna de agrupación?
Agregue
expression
o la subexpresión pertinente deexpression
a la cláusulaGROUP BY
.¿La referencia de columna forma parte de una expresión
GROUP BY
que difiere deepression
?Haz coincidir la expresión con la lista de
SELECT
o simplifica la expresiónGROUP BY
.¿Falta la agregación?
Encapsule la referencia de columna en una función de agregado. Si solo desea un valor representativo del grupo, puede usar any_value(epression).
Ejemplos
-- 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
Relacionado
- Funciones de agregado
- Cláusula GROUP BY
- Cláusula HAVING
- SELECT (subselect)