MISSING_AGGREGATION třída chyb
Výraz bez agregace <expression>
je založený na sloupcích, které se neúčastní klauzule GROUP BY.
Přidejte sloupce nebo výraz do GROUP BY, agregujte výraz nebo použijte <expressionAnyValue>
, pokud vám není jedno, která z hodnot v rámci skupiny se vrátí.
Parametry
-
výraz: Ne agregující výraz v seznamu.
SELECT
-
expressionAnyValue:
expression
zabalené do agregační funkce any_value().
Vysvětlení
V kontextu dotazu s klauzulí GROUP BY musí být místní odkazy na sloupce v seznamu SELECT :
- Spotřebováno jako argument pro agregační funkci nebo
- Část výrazu, který odpovídá výrazu v klauzuli
GROUP BY
.
Odkaz na místní sloupec je sloupec, který byl přeložen na odkaz na tabulku v klauzuli FROM dotazu.
Jinými slovy: Odkazy na sloupce musí být buď součástí klíčů seskupení, nebo musí být součástí agregace.
Azure Databricks při maximálním úsilí porovnává výrazy: Například rozpozná: SELECT c1 + 5 FROM T GROUP BY 5 + c1
jako matematické výrazy.
Ale SELECT c1 FROM T GROUP BY c1 + 5
není to shoda.
Zmírnění
Zmírnění chyby závisí na příčině:
Chybí vám seskupovací sloupec?
Přidejte
expression
do klauzule , nebo odpovídající dílčí výrazexpression
GROUP BY
.Je odkaz na sloupec součástí výrazu
GROUP BY
, který se liší odepression
?Porovná výraz v
SELECT
seznamu nebo výraz zjednodušíGROUP BY
.Chybí vám agregace?
Zabalte odkaz na sloupec pomocí agregační funkce. Pokud chcete pouze reprezentativní hodnotu ze skupiny, můžete použít any_value(epression).
Příklady
-- 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