Udostępnij za pośrednictwem


MISSING_AGGREGATION, klasa błędów

SQLSTATE: 42803

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 expressionlub odpowiednie wyrażenie expression do klauzuli GROUP BY.

  • Czy odwołanie do kolumny w wyrażeniu GROUP BY różni się od epression?

    Dopasuj wyrażenie na liście SELECT lub uprość wyrażenie GROUP 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