Pular para o conteúdo principal

Classe de erro MISSING_AGGREGATION

SQLSTATE: 42803

A expressão não agregadora <expression> é baseada em colunas que não participam da cláusula GROUP BY.

Adicione as colunas ou a expressão ao GROUP BY, agregue a expressão ou use <expressionAnyValue> se você não se importa com quais valores dentro de um grupo serão retornados.

Parâmetros

  • expressão: expressão não agregadora e sem agrupamento na lista SELECT.
  • expressionAnyValue : expression agrupado em uma função agregada any_value ().

Explicação

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

  • Consumido como argumento para uma 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 como uma referência de tabela na cláusula FROM da consulta.

Em outras palavras: As referências de coluna devem fazer parte da chave de agrupamento ou devem fazer parte da agregação.

O Databricks faz a correspondência de expressões no melhor esforço : Por exemplo, ele reconhecerá: SELECT c1 + 5 FROM T GROUP BY 5 + c1 como expressões de correspondência. Mas SELECT c1 FROM T GROUP BY c1 + 5 não é compatível.

Mitigação

A mitigação do erro depende da causa:

  • Você perdeu uma coluna de agrupamento?

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

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

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

  • Você está perdendo a agregação?

    Envolva a referência da coluna com uma função agregada. Se você quiser apenas um valor representativo do grupo, poderá usar qualquer_valor (expressão).

Exemplos

SQL
-- 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