Partilhar via


classe de erro MISSING_AGGREGATION

SQLSTATE: 42803

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 expressionou a subexpressão relevante de expression à GROUP BY cláusula .

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

    Corresponda à expressão na SELECT lista ou simplifique a GROUP 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