Sdílet prostřednictvím


MISSING_AGGREGATION třída chyb

SQLSTATE: 42803

Výraz bez agregace <expression> je založený na sloupcích, které se neúčastní klauzule GROUP BY.

Přidejte sloupce nebo výraz do GROUP BY, agregujte výraz nebo použijte <expressionAnyValue> , pokud vám není jedno, která z hodnot v rámci skupiny se vrátí.

Parametry

  • výraz: Ne agregující výraz v seznamu.SELECT
  • expressionAnyValue: expression zabalené do agregační funkce any_value().

Vysvětlení

V kontextu dotazu s klauzulí GROUP BY musí být místní odkazy na sloupce v seznamu SELECT :

  • Spotřebováno jako argument pro agregační funkci nebo
  • Část výrazu, který odpovídá výrazu v klauzuli GROUP BY .

Odkaz na místní sloupec je sloupec, který byl přeložen na odkaz na tabulku v klauzuli FROM dotazu.

Jinými slovy: Odkazy na sloupce musí být buď součástí klíčů seskupení, nebo musí být součástí agregace.

Azure Databricks při maximálním úsilí porovnává výrazy: Například rozpozná: SELECT c1 + 5 FROM T GROUP BY 5 + c1 jako matematické výrazy. Ale SELECT c1 FROM T GROUP BY c1 + 5 není to shoda.

Zmírnění

Zmírnění chyby závisí na příčině:

  • Chybí vám seskupovací sloupec?

    Přidejte expressiondo klauzule , nebo odpovídající dílčí výraz expressionGROUP BY .

  • Je odkaz na sloupec součástí výrazu GROUP BY , který se liší od epression?

    Porovná výraz v SELECT seznamu nebo výraz zjednoduší GROUP BY .

  • Chybí vám agregace?

    Zabalte odkaz na sloupec pomocí agregační funkce. Pokud chcete pouze reprezentativní hodnotu ze skupiny, můžete použít any_value(epression).

Příklady

-- 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