MISSING_AGGREGATION, klasa błędów
Wyrażenie nie agregujące <expression>
jest oparte na kolumnach, które nie uczestniczą w klauzuli GROUP BY.
Dodaj kolumny lub wyrażenie do GROUP BY, zagreguj wyrażenie lub użyj <expressionAnyValue>
, jeśli nie obchodzisz, które wartości w grupie są zwracane.
Parametry
-
wyrażenie: wyrażenie nie agregujące, nie grupujące na liście
SELECT
. -
expressionAnyValue:
expression
opakowana w funkcję agregacji any_value().
Wyjaśnienie
W kontekście zapytania z klauzulą GROUP BY lokalne odwołania do kolumn na liście SELECT muszą być następujące:
- Używane jako argument funkcji agregującej lub
- Część wyrażenia, które pasuje do wyrażenia w klauzuli
GROUP BY
.
Referencja 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 dopasuje wyrażenia do najlepszych wysiłków: 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 pasuje.
Łagodzenia
Ograniczenie ryzyka błędu zależy od przyczyny:
Czy pominięto kolumnę grupowania?
Dodaj
expression
lub odpowiednie wyrażenieexpression
do klauzuliGROUP BY
.Czy odwołanie do kolumny w wyrażeniu
GROUP BY
różni się odepression
?Dopasuj wyrażenie na liście
SELECT
lub uprość wyrażenieGROUP BY
.Czy brakuje agregacji?
Zawijaj odwołanie do kolumny za pomocą funkcji agregującej. Jeśli chcesz tylko reprezentatywną wartość 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
Powiązane
- Funkcje agregujące
- GROUP BY klauzuli
- HAVING klauzuli
- SELECT (podwybierz)