فئة الخطأ 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 عبارة .

  • هل مرجع العمود جزء من GROUP BY تعبير يختلف عن epression؟

    مطابقة التعبير في 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