Поделиться через


класс ошибок MISSING_AGGREGATION

SQLSTATE: 42803

Нерегластрирующее выражение <expression> основано на столбцах, которые не участвуют в предложении GROUP BY.

Добавьте столбцы или выражение в GROUP BY, агрегируйте выражение или используйте <expressionAnyValue>, если вам не важно, какое из значений в группе возвращается.

Параметры

  • выражение: не агрегирующее, не группирующее выражение в списке SELECT.
  • expressionAnyValue: expression, упакованный в агрегатную функцию any_value().

Объяснение

В контексте запроса с предложением GROUP BY локальные ссылки на столбцы в списке SELECT должны быть:

  • Используется как аргумент агрегатной функции или
  • Часть выражения, которое соответствует выражению в предложении GROUP BY.

Ссылка на локальный столбец — это столбец, который был сопоставлен с ссылкой на таблицу в предложении FROM запроса.

Другими словами: ссылки на столбцы должны быть частью ключей группировки или частью агрегации.

Azure Databricks соответствует выражениям наилучших усилий: например, он распознает: SELECT c1 + 5 FROM T GROUP BY 5 + c1 как математические выражения. Но SELECT c1 FROM T GROUP BY c1 + 5 не совпадает.

Смягчение

Устранение ошибки зависит от причины:

  • вы пропустили группировочный столбец?

    Добавьте expressionили соответствующее подтекстовое выражение expression в предложение GROUP BY.

  • Является ли ссылка на столбец частью выражения GROUP BY, которое отличается от epression?

    Сопоставьте выражение в списке SELECT или упростите выражение GROUP BY.

  • Вы не замечаете, что отсутствует агрегирование?

    Оберните ссылку на столбец с агрегатной функцией. Если требуется только репрезентативное значение из группы, можно использовать any_value(expression).

Примеры

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