次の方法で共有


MISSING_AGGREGATION エラー クラス

SQLSTATE: 42803

非集計式 <expression> は、GROUP BY 句に参加していない列に基づいています。

列または式を GROUP BYに追加し、式を集計するか、グループ内のどの値が返されるかを気にしない場合は <expressionAnyValue> を使用します。

パラメーター

  • 式の: SELECT リスト内の非集計式、非グループ化式。
  • expressionAnyValue: expression は any_value() 集計関数でラップされています。

説明

GROUP BY 句を持つクエリのコンテキスト内で、SELECT リスト内のローカル列参照は次の条件を満たす必要があります。

  • 集計関数の引数として使用される。または、
  • GROUP BY 句の式と一致する式の一部。

ローカル列参照は、クエリの FROM 句で テーブル参照 に解決された列です。

つまり、列参照はグループ化キーの一部であるか、集計の一部である必要があります。

Azure Databricks では、式の一致が "ベスト エフォート" で行われます。たとえば、SELECT c1 + 5 FROM T GROUP BY 5 + c1 は数式として認識されます。 ただし、SELECT c1 FROM T GROUP BY c1 + 5 は一致ではありません。

緩和

エラーの軽減策は、原因によって異なります。

  • グループ化列が見つかりませんでしたか?

    expression、または expression の関連する部分式を GROUP BY 句に追加します。

  • epressionとは異なる GROUP BY 式の列参照部分ですか?

    SELECT リスト内の式と一致するか、GROUP BY 式を簡略化します。

  • 集計が見つかりませんか?

    列参照を集計関数で包みます。 グループの代表的な値のみが必要な場合は、any_value (抑制)を使用できます。

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