Bagikan melalui


kondisi kesalahan MISSING_AGGREGATION

SQLSTATE: 42803

Ekspresi non-agregat <expression> didasarkan pada kolom yang tidak berpartisipasi dalam klausa GROUP BY.

Tambahkan kolom atau ekspresi ke GROUP BY, agregat ekspresi, atau gunakan <expressionAnyValue> jika Anda tidak peduli nilai mana dalam grup yang dikembalikan.

Parameter-parameternya

  • ekspresi: Ekspresi non-agregasi, non-kelompok dalam daftar SELECT.
  • expressionAnyValue: expression dibungkus dalam fungsi agregat any_value().

Penjelasan

Dalam konteks kueri dengan klausa GROUP BY, referensi kolom lokal dalam daftar SELECT harus:

  • Digunakan sebagai argumen untuk fungsi agregat , atau
  • Bagian dari ekspresi yang sesuai dengan ekspresi pada klausa GROUP BY.

Referensi kolom lokal adalah kolom yang telah dihubungkan ke referensi tabel dalam klausa FROM dari kueri.

Dengan kata lain: Referensi kolom harus menjadi bagian dari kunci pengelompokan, atau harus menjadi bagian dari agregasi.

Azure Databricks mencocokkan ekspresi berdasarkan upaya terbaik : Misalnya, akan mengenali: SELECT c1 + 5 FROM T GROUP BY 5 + c1 sebagai padanan ekspresi. Tapi SELECT c1 FROM T GROUP BY c1 + 5 tidak cocok.

Mitigasi

Mitigasi kesalahan tergantung pada penyebabnya:

  • Apakah Anda melewatkan kolom pengelompokan?

    Tambahkan expression, atau subekspresi expression yang relevan ke klausa GROUP BY.

  • Apakah bagian referensi kolom dari ekspresi GROUP BY yang berbeda dari epression?

    Cocokkan ekspresi dalam daftar SELECT atau sederhanakan ekspresi GROUP BY.

  • Apakah Anda kehilangan agregasi?

    Bungkus referensi kolom dengan fungsi agregat. Jika Anda hanya menginginkan nilai representatif dari grup, Anda dapat menggunakan any_value(epression).

Contoh

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