Compartir a través de


MISSING_AGGREGATION (clase de error)

SQLSTATE: 42803

La expresión de no agregación <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

En el contexto de una consulta con una cláusula GROUP BY, las referencias de columna locales de la lista SELECT deben cumplir lo siguiente:

  • Consumirse como argumento de una función de agregado, o bien
  • Formar parte de una expresión que coincida con una expresión de 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 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 de expression a la cláusula GROUP BY.

  • ¿La referencia de columna forma parte de una expresión GROUP BY que difiere de epression?

    Busque una coincidencia para la expresión en la lista SELECT o simplifique la expresión GROUP 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(expresión).

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