MISSING_AGGREGATION, klasa błędów
Wyrażenie <expression>
nie agregujące jest oparte na kolumnach, które nie uczestniczą w klauzuli GROUP BY.
Dodaj kolumny lub wyrażenie do grupy, zagreguj wyrażenie lub użyj <expressionAnyValue>
, jeśli nie obchodzi się, które wartości w grupie są zwracane.
Parametry
-
wyrażenie: nie agregujące, nie grupujące wyrażenie na
SELECT
liście. -
expressionAnyValue:
expression
opakowana w funkcję agregacji any_value().
Wyjaśnienie
W kontekście zapytania z klauzulą GROUP BY odwołania do kolumn lokalnych na liście SELECT muszą być następujące:
- Używane jako argument do funkcji agregującej lub
- Część wyrażenia, które pasuje do wyrażenia w klauzuli
GROUP BY
.
Odwołanie do kolumny lokalnej to kolumna, która została rozpoznana jako odwołanie do tabeli w klauzuli FROM zapytania.
Innymi słowy: odwołania do kolumn muszą być częścią kluczy grupowania lub muszą być częścią agregacji.
Usługa Azure Databricks pasuje do wyrażeń na potrzeby najlepszego wysiłku: na przykład rozpozna: SELECT c1 + 5 FROM T GROUP BY 5 + c1
jako wyrażenia matematyczne.
Ale SELECT c1 FROM T GROUP BY c1 + 5
nie jest dopasowaniem.
Łagodzenia
Ograniczenie ryzyka błędu zależy od przyczyny:
Czy brakowało kolumny grupowania?
Dodaj
expression
element lub odpowiednie podwyrażanie doexpression
klauzuliGROUP BY
.Czy część odwołania do kolumny
GROUP BY
wyrażenia różni się odepression
?Dopasuj wyrażenie na
SELECT
liście lub uprośćGROUP BY
wyrażenie.Czy brakuje agregacji?
Zawijaj odwołanie do kolumny za pomocą funkcji agregującej. Jeśli potrzebujesz tylko reprezentatywnej wartości z grupy, możesz użyć any_value(epression).
Przykłady
-- 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