класс ошибки MISSING_AGGREGATION
Неагрегированное выражение <expression>
основано на столбцах, которые не участвуют в предложении GROUP BY.
Добавьте столбцы или выражение в GROUP BY, агрегирует выражение или используйте <expressionAnyValue>
, если вам не важно, какое из значений в группе возвращается.
Параметры
-
expression: не агрегирующее, негруппированное выражение в списке
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(epression).
Примеры
-- 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