Partilhar via


Condição de erro de MISSING_AGGREGATION

SQLSTATE: 42803

A expressão não agregadora <expression> baseia-se em colunas que não participam na cláusula GROUP BY.

Adiciona as colunas ou a expressão ao GROUP BY, agrega a expressão, ou usa <expressionAnyValue> se não te importares com qual dos valores dentro de um grupo é devolvido.

Parâmetros

  • expressão: Expressão não agregante e não agrupante na lista de SELECT.
  • expressionAnyValue: expression encapsulado numa função de agregação any_value().

Explicação

No contexto de uma consulta com uma cláusula GROUP BY, as referências locais às colunas na lista de SELECT devem ser:

  • Consumido como argumento numa função agregada , ou
  • Parte de uma expressão que corresponde a uma expressão na cláusula GROUP BY.

Uma referência de coluna local é uma coluna que foi resolvida para uma referência de tabela na cláusula FROM da consulta.

Em outras palavras, as referências de coluna devem ser parte das chaves de agrupamento ou devem integrar a agregação.

O Azure Databricks tenta corresponder as expressões em da melhor forma possível: Por exemplo, reconhecerá SELECT c1 + 5 FROM T GROUP BY 5 + c1 como expressões correspondentes. Mas SELECT c1 FROM T GROUP BY c1 + 5 não é páreo.

Atenuação

A atenuação do erro depende da causa:

  • Perdeu uma coluna de agrupamento?

    Adicione expression, ou a subexpressão relevante de expression à cláusula GROUP BY.

  • A referência da coluna é parte de uma expressão GROUP BY que é diferente da epression?

    Corresponda à expressão na lista SELECT ou simplifique a expressão GROUP BY.

  • Está faltando a agregação?

    Envolva a referência da coluna com uma função de agregação. Se você quiser apenas um valor representativo do grupo, poderá usar 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