класс ошибок MISSING_AGGREGATION
Нерегластрирующее выражение <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