MISSING_AGGREGATION-felklass
Det icke-aggregerande uttrycket <expression>
baseras på kolumner som inte deltar i GROUP BY-satsen.
Lägg till kolumnerna eller uttrycket i GROUP BY, aggregera uttrycket eller använd <expressionAnyValue>
om du inte bryr dig om vilka av värdena i en grupp som returneras.
Parametrar
-
uttryck: Icke-aggregering, icke-grupperingsuttryck i listan
SELECT
. -
expressionAnyValue:
expression
omsluten av en any_value() aggregatfunktion.
Förklaring
I kontexten för en fråga med en GROUP BY-sats måste de lokala kolumnreferenserna i listan SELECT vara:
- Används som argument för en mängdfunktion, eller
- En del av ett uttryck som matchar ett uttryck i
GROUP BY
-satsen.
En lokal kolumnreferens är en kolumn som har lösts till en tabellreferens i frågans FROM-sats.
Med andra ord: Kolumnreferenser måste antingen ingå i grupperingsnycklarna eller vara en del av aggregeringen.
Azure Databricks matchar uttryck på bästa: Till exempel identifieras: SELECT c1 + 5 FROM T GROUP BY 5 + c1
som matematiska uttryck.
Men SELECT c1 FROM T GROUP BY c1 + 5
är inte någon match.
Förmildrande omständighet
Avhjälpandet av felet beror på orsaken:
Missade du en grupperingskolumn?
Lägg till
expression
, eller relevant underuttryck avexpression
iGROUP BY
-satsen.Är kolumnreferensen en del av ett
GROUP BY
-uttryck som skiljer sig frånepression
?Matcha uttrycket i
SELECT
-listan eller förenklaGROUP BY
-uttrycket.Saknar du aggregeringen?
Omslut kolumnreferensen med en mängdfunktion. Om du bara vill ha ett representativt värde från gruppen kan du använda any_value(epression).
Exempel
-- 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