MISSING_AGGREGATION エラー クラス
非集計式 <expression>
は、GROUP BY 句に参加していない列に基づいています。
GROUP BY に列または式を追加するか、式を集計します。または、グループ内のどの値が返されるかを気にしない場合、<expressionAnyValue>
を使用します。
パラメーター
-
expression:
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(epression) を使用できます。
例
-- 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