Anmerkung
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen, dich anzumelden oder die Verzeichnisse zu wechseln.
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen , die Verzeichnisse zu wechseln.
Der nicht aggregierende Ausdruck <expression> basiert auf Spalten, die nicht an der GROUP BY-Klausel teilnehmen.
Fügen Sie die Spalten oder den Ausdruck zu GROUP BYhinzu, aggregieren Sie den Ausdruck, oder verwenden Sie <expressionAnyValue>, wenn es Ihnen egal ist, welcher der Werte innerhalb einer Gruppe zurückgegeben wird.
Parameter
-
Ausdruck: Nicht aggregierender, nicht gruppierender Ausdruck in der
SELECT-Liste. -
expressionAnyValue:
expression, umschlossen in einer any_value()-Aggregatfunktion.
Erklärung
Im Kontext einer Abfrage mit einer GROUP BY-Klausel müssen die lokalen Spaltenverweise in der SELECT Liste folgendes sein:
- Verwendung als Argument für eine Aggregatfunktion oder
- Teil eines Ausdrucks, der einem Ausdruck in der
GROUP BY-Klausel entspricht.
Ein lokaler Spaltenverweis ist eine Spalte, die in eine Tabellenreferenz in der FROM-Klausel der Abfrage aufgelöst wurde.
Mit anderen Worten: Spaltenverweise müssen entweder Teil der Gruppierungsschlüssel sein, oder sie müssen Teil der Aggregation sein.
Azure Databricks gleicht Ausdrücke nach dem Best Effort-Prinzip (bestmöglich) ab: SELECT c1 + 5 FROM T GROUP BY 5 + c1 wird beispielsweise als mathematischer Ausdruck erkannt.
SELECT c1 FROM T GROUP BY c1 + 5 dagegen ist keine Übereinstimmung.
Milderung
Die Entschärfung des Fehlers hängt von der Ursache ab:
Fehlte eine Gruppierungsspalte?
Fügen Sie
expressionoder den relevanten Unterausdruck vonexpressionzurGROUP BY-Klausel hinzu.Ist die Spaltenreferenz Teil eines
GROUP BY-Ausdrucks, der sich vonepressionunterscheidet?Gleichen Sie den Ausdruck in der Liste
SELECTab, oder vereinfachen Sie denGROUP BY-Ausdruck.Fehlt die Aggregation?
Umschließen Sie den Spaltenverweis mit einer Aggregatfunktion. Wenn Sie nur einen repräsentativen Wert aus der Gruppe wünschen, können Sie any_value(epression)verwenden.
Beispiele
-- 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