Compartir a través de


Clase de error MISSING_AGGREGATION

SQLSTATE: 42803

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 expressiono 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?

    Haz coincidir la expresión con la lista de SELECT o simplifica 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(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