MISSING_AGGREGATION foutklasse
De niet-aggregerende expressie <expression>
is gebaseerd op kolommen die niet deelnemen aan de GROUP BY-clausule.
Voeg de kolommen of de expressie toe aan het GROUP BY, voeg de expressie samen of gebruik <expressionAnyValue>
als u niet wilt bepalen welke waarden in een groep worden geretourneerd.
Parameters
-
-expressie: niet-samengevoegde, niet-groeperingsuitdrukking in de
SELECT
-lijst. -
expressionAnyValue:
expression
verpakt in een statistische functie van any_value().
Uitleg
Binnen de context van een query met een GROUP BY-component moeten de lokale kolomverwijzingen in de SELECT lijst zijn:
- Wordt gebruikt als argument voor een statistische functieof
- Een deel van een expressie die overeenkomt met een expressie in de
GROUP BY
-component.
Een lokale kolomverwijzing is een kolom die is omgezet in een tabelverwijzing in de FROM--component van de query.
Met andere woorden: Kolomverwijzingen moeten deel uitmaken van de groeperingssleutels, of ze moeten deel uitmaken van de aggregatie.
Azure Databricks matcht expressies op best effort: bijvoorbeeld herkent het: SELECT c1 + 5 FROM T GROUP BY 5 + c1
als overeenkomende expressies.
Maar SELECT c1 FROM T GROUP BY c1 + 5
komt niet overeen.
Verzachting
De beperking van de fout is afhankelijk van de oorzaak:
Hebt u een groeperingskolom gemist?
Voeg
expression
of de relevante subexpressie vanexpression
toe aan deGROUP BY
component.Is het kolomreferentiegedeelte van een
GROUP BY
-expressie die verschilt vanepression
?De expressie in de
SELECT
lijst vergelijken of deGROUP BY
-expressie vereenvoudigen.Ontbreekt de aggregatie?
Omhul de kolomreferentie met een aggregatiefunctie. Als u alleen een representatieve waarde van de groep wilt, kunt u any_value(epressie)gebruiken.
Voorbeelden
-- 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