MISSING_AGGREGATION, klasa błędów

SQLSTATE: 42803

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 expressionelement lub odpowiednie podwyrażanie do expression klauzuli GROUP BY .

  • Czy część odwołania do kolumny GROUP BY wyrażenia różni się od epression?

    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