Sdílet prostřednictvím


MISSING_AGGREGATION třída chyby

SQLSTATE: 42803

Neagregační výraz <expression> je založený na sloupcích, které nejsou zahrnuty v klauzuli GROUP BY.

Přidejte sloupce nebo výraz do GROUP BY, agregujte výraz nebo použijte <expressionAnyValue>, pokud nezajímáte, které hodnoty v rámci skupiny se vrátí.

Parametry

  • výraz: Neagregující, neseskupující výraz v seznamu SELECT.
  • expressionAnyValue: expression zabalený v agregační funkci any_value().

Vysvětlení

V rámci dotazu obsahujícího klauzuli GROUP BY musí být odkazy na místní sloupce v seznamu SELECT:

  • Používáno jako argument agregované funkce nebo
  • Část výrazu, který odpovídá výrazu v klauzuli GROUP BY.

Odkaz na místní sloupec je sloupec, který byl vyřešen jako 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 porovnává výrazy na základě podle možností: Například rozpozná: SELECT c1 + 5 FROM T GROUP BY 5 + c1 jako odpovídající výrazy. Ale SELECT c1 FROM T GROUP BY c1 + 5 se neshoduje.

Zmírnění

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

  • Chybí vám sloupec seskupování?

    Přidejte expressionnebo relevantní dílčí výraz expression do klauzule GROUP BY.

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

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

  • Chybí vám agregace?

    Obklopte odkaz na sloupec agregační funkcí. 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