عبارة GROUP BY

ينطبق على:وضع علامة Databricks SQL وضع علامة Databricks Runtime

GROUP BY يتم استخدام العبارة لتجميع الصفوف استنادا إلى مجموعة من تعبيرات التجميع المحددة وتجميعات الحساب على مجموعة الصفوف استنادا إلى دالة تجميعية محددة واحدة أو أكثر. يدعم Databricks SQL أيضا التجميعات المتقدمة لإجراء تجميعات متعددة لنفس مجموعة سجلات الإدخال عبر GROUPING SETSعبارات و CUBEROLLUP و. يمكن خلط تعبيرات التجميع والتجميعات المتقدمة في GROUP BY عبارة وتداخلها في عبارة GROUPING SETS .

راجع المزيد من التفاصيل في قسم تحليلات التجميع المختلط/المتداخل.

FILTER عند إرفاق عبارة بدالة تجميعية، يتم تمرير الصفوف المطابقة فقط إلى تلك الدالة.

بناء الجملة

GROUP BY ALL

GROUP BY group_expression [, ...] [ WITH ROLLUP | WITH CUBE ]

GROUP BY { group_expression | { ROLLUP | CUBE | GROUPING SETS } ( grouping_set [, ...] ) } [, ...]

grouping_set
   { expression |
     ( [ expression [, ...] ] ) }

بينما يتم تعريف الدالات التجميعية على أنها

aggregate_name ( [ DISTINCT ] expression [, ...] ) [ FILTER ( WHERE boolean_expression ) ]

المعلمات

  • جميع

    ينطبق على:وضع علامة Databricks SQL وضع علامة Databricks Runtime 12.2 LTS وما فوق

    رمز اختصار لإضافة كافة SELECTتعبيرات القائمة التي لا تحتوي على دالات تجميعية ك group_expressions. إذا لم يكن هناك GROUP BY ALL مثل هذا التعبير يعادل حذف العبارة GROUP BY التي ينتج عنها تجميع عمومي.

    GROUP BY ALL غير مضمون لإنتاج مجموعة من تعبيرات المجموعة التي يمكن حلها. يثير Azure Databricks UNRESOLVED_ALL_IN_GROUP_BY أو MISSING_AGGREGATION إذا لم تكن العبارة المنتجة جيدة التكوين.

  • group_expression

    تحديد معايير تجميع الصفوف معا. يتم تنفيذ تجميع الصفوف استنادا إلى قيم نتائج تعبيرات التجميع. قد يكون تعبير التجميع اسم عمود مثل GROUP BY a، أو موضع العمود مثل GROUP BY 0، أو تعبير مثل GROUP BY a + b. إذا كان group_expression يحتوي على دالةتجميعية فإن Azure Databricks يثير خطأ GROUP_BY_AGGREGATE.

  • grouping_set

    يتم تحديد مجموعة التجميع بواسطة تعبيرات مفصولة بفاصلة صفر أو أكثر بين أقواس. عندما تحتوي مجموعة التجميع على عنصر واحد فقط، يمكن حذف الأقواس. على سبيل المثال، GROUPING SETS ((a), (b)) هو نفس GROUPING SETS (a, b).

  • مجموعات التجميع

    تجميع الصفوف لكل مجموعة تجميع محددة بعد GROUPING SETS. على سبيل المثال:

    GROUP BY GROUPING SETS ((warehouse), (product)) مكافئ دلاليا لاتحاد نتائج GROUP BY warehouse و GROUP BY product.

    هذه العبارة هي اختصار حيث UNION ALL تقوم كل ساق من UNION ALL عامل التشغيل بتجميع كل مجموعة تجميع محددة في العبارة GROUPING SETS .

    وبالمثل، GROUP BY GROUPING SETS ((warehouse, product), (product), ()) هو مكافئ دلالي لاتحاد نتائج GROUP BY warehouse, product، GROUP BY product وتجميع عالمي.

إشعار

بالنسبة لتوافق Apache Hive، يسمح Databricks SQL .GROUP BY ... GROUPING SETS (...) GROUP BY عادة ما يتم تجاهل التعبيرات، ولكن إذا كانت تحتوي على تعبيرات إضافية بالإضافة إلى GROUPING SETS التعبيرات، فسيتم تضمين التعبيرات الإضافية في تعبيرات التجميع وتكون القيمة دائما خالية. على سبيل المثال، SELECT a, b, c FROM ... GROUP BY a, b, c GROUPING SETS (a, b)، يكون إخراج العمود c دائما فارغا.

  • التراكميه

    تحديد مستويات متعددة من التجميعات في عبارة واحدة. تستخدم هذه العبارة لحساب التجميعات استنادا إلى مجموعات تجميع متعددة. ROLLUP هو اختصار ل GROUPING SETS. على سبيل المثال:

    GROUP BY warehouse, product WITH ROLLUP أو GROUP BY ROLLUP(warehouse, product) يعادل

    GROUP BY GROUPING SETS((warehouse, product), (warehouse), ()).

    بينما GROUP BY ROLLUP(warehouse, product, (warehouse, location))

    يعادل GROUP BY GROUPING SETS((warehouse, product, location), (warehouse, product), (warehouse), ()).

    تؤدي عناصر N للمواصفات ROLLUP إلى N+1 GROUPING SETS.

  • مكعب

    CUBE يتم استخدام العبارة لإجراء التجميعات استنادا إلى مجموعة من أعمدة التجميع المحددة في العبارة GROUP BY . CUBE هو اختصار ل GROUPING SETS. على سبيل المثال:

    GROUP BY warehouse, product WITH CUBE أو GROUP BY CUBE(warehouse, product) يعادل

    GROUP BY GROUPING SETS((warehouse, product), (warehouse), (product), ()).

    GROUP BY CUBE(warehouse, product, (warehouse, location)) يعادل ما يلي:

    GROUP BY GROUPING SETS((warehouse, product, location), (warehouse, product), (warehouse, location), (product, warehouse, location), (warehouse), (product), (warehouse, product), ())
    

    ينتج عن عناصر N للمواصفات CUBE 2^N GROUPING SETS.

  • aggregate_name

    اسم دالة تجميعية (MIN وMAX وCOUNT وSUM وAVG وما إلى ذلك).

  • متميزه

    إزالة التكرارات في صفوف الإدخال قبل تمريرها إلى الدالات التجميعية.

  • تصفيه

    تصفية صفوف الإدخال التي boolean_expression يتم تمريرها في العبارة WHERE إلى true إلى الدالة التجميعية؛ يتم تجاهل الصفوف الأخرى.

تحليلات التجميع المختلط/المتداخل

GROUP BY يمكن أن تتضمن عبارة group_expressions متعددة CUBEROLLUPومتعددة و و.GROUPING SETS

GROUPING SETSيمكن أن تحتوي أيضا على عبارات أو CUBEROLLUPأو متداخلةGROUPING SETS. على سبيل المثال:

GROUPING SETS(ROLLUP(warehouse, location), CUBE(warehouse, location)), GROUPING SETS(warehouse, GROUPING SETS(location, GROUPING SETS(ROLLUP(warehouse, location), CUBE(warehouse, location))))

CUBE وهو ROLLUP مجرد سكر بناء الجملة ل GROUPING SETS. يرجى الرجوع إلى الأقسام أعلاه لمعرفة كيفية الترجمة CUBE وإلى ROLLUPGROUPING SETS. group_expression يمكن التعامل معها كمجموعة GROUPING SETS واحدة في هذا السياق.

بالنسبة إلى متعدد GROUPING SETS في GROUP BY عبارة ، يقوم Databricks SQL بإنشاء واحد GROUPING SETS عن طريق القيام بمنتج متقاطع من الأصلي GROUPING SETS.

بالنسبة إلى المتداخلة GROUPING SETS في GROUPING SETS عبارة ، يأخذ Databricks SQL مجموعات التجميع الخاصة به ويجردها. على سبيل المثال، الاستعلامات التالية:

GROUP BY warehouse, GROUPING SETS((product), ()), GROUPING SETS((location, size), (location), (size), ());

GROUP BY warehouse, ROLLUP(product), CUBE(location, size);

مكافئة للآتي:

GROUP BY GROUPING SETS( (warehouse, product, location, size), (warehouse, product, location), (warehouse, product, size), (warehouse, product), (warehouse, location, size), (warehouse, location), (warehouse, size), (warehouse))

بينما GROUP BY GROUPING SETS(GROUPING SETS(warehouse), GROUPING SETS((warehouse, product)))

يعادل GROUP BY GROUPING SETS((warehouse), (warehouse, product)).

الأمثلة

CREATE TEMP VIEW dealer (id, city, car_model, quantity) AS
VALUES (100, 'Fremont', 'Honda Civic', 10),
       (100, 'Fremont', 'Honda Accord', 15),
       (100, 'Fremont', 'Honda CRV', 7),
       (200, 'Dublin', 'Honda Civic', 20),
       (200, 'Dublin', 'Honda Accord', 10),
       (200, 'Dublin', 'Honda CRV', 3),
       (300, 'San Jose', 'Honda Civic', 5),
       (300, 'San Jose', 'Honda Accord', 8);

-- Sum of quantity per dealership. Group by `id`.
> SELECT id, sum(quantity) FROM dealer GROUP BY id ORDER BY id;
  id sum(quantity)
 --- -------------
 100            32
 200            33
 300            13

-- Use column position in GROUP by clause.
> SELECT id, sum(quantity) FROM dealer GROUP BY 1 ORDER BY 1;
  id sum(quantity)
 --- -------------
 100            32
 200            33
 300            13

-- Multiple aggregations.
-- 1. Sum of quantity per dealership.
-- 2. Max quantity per dealership.
> SELECT id, sum(quantity) AS sum, max(quantity) AS max
    FROM dealer GROUP BY id ORDER BY id;
  id sum max
 --- --- ---
 100  32  15
 200  33  20
 300  13   8

-- Count the number of distinct dealers in cities per car_model.
> SELECT car_model, count(DISTINCT city) AS count FROM dealer GROUP BY car_model;
    car_model count
 ------------ -----
  Honda Civic     3
    Honda CRV     2
 Honda Accord     3

-- Count the number of distinct dealers in cities per car_model, using GROUP BY ALL
> SELECT car_model, count(DISTINCT city) AS count FROM dealer GROUP BY ALL;
    car_model count
 ------------ -----
  Honda Civic     3
    Honda CRV     2
 Honda Accord     3

-- Sum of only 'Honda Civic' and 'Honda CRV' quantities per dealership.
> SELECT id,
         sum(quantity) FILTER (WHERE car_model IN ('Honda Civic', 'Honda CRV')) AS `sum(quantity)`
    FROM dealer
    GROUP BY id ORDER BY id;
  id sum(quantity)
 --- -------------
 100            17
 200            23
 300             5

-- Aggregations using multiple sets of grouping columns in a single statement.
-- Following performs aggregations based on four sets of grouping columns.
-- 1. city, car_model
-- 2. city
-- 3. car_model
-- 4. Empty grouping set. Returns quantities for all city and car models.
> SELECT city, car_model, sum(quantity) AS sum
    FROM dealer
    GROUP BY GROUPING SETS ((city, car_model), (city), (car_model), ())
    ORDER BY city;
      city    car_model sum
 --------- ------------ ---
      null         null  78
      null  HondaAccord  33
      null     HondaCRV  10
      null   HondaCivic  35
    Dublin         null  33
    Dublin  HondaAccord  10
    Dublin     HondaCRV   3
    Dublin   HondaCivic  20
   Fremont         null  32
   Fremont  HondaAccord  15
   Fremont     HondaCRV   7
   Fremont   HondaCivic  10
  San Jose         null  13
  San Jose  HondaAccord   8
  San Jose   HondaCivic   5

-- Group by processing with `ROLLUP` clause.
-- Equivalent GROUP BY GROUPING SETS ((city, car_model), (city), ())
> SELECT city, car_model, sum(quantity) AS sum
    FROM dealer
    GROUP BY city, car_model WITH ROLLUP
    ORDER BY city, car_model;
      city    car_model sum
 --------- ------------ ---
      null         null  78
    Dublin         null  33
    Dublin  HondaAccord  10
    Dublin     HondaCRV   3
    Dublin   HondaCivic  20
   Fremont         null  32
   Fremont  HondaAccord  15
   Fremont     HondaCRV   7
   Fremont   HondaCivic  10
  San Jose         null  13
  San Jose  HondaAccord   8
  San Jose   HondaCivic   5

-- Group by processing with `CUBE` clause.
-- Equivalent GROUP BY GROUPING SETS ((city, car_model), (city), (car_model), ())
> SELECT city, car_model, sum(quantity) AS sum
    FROM dealer
    GROUP BY city, car_model WITH CUBE
    ORDER BY city, car_model;
      city    car_model sum
 --------- ------------ ---
      null         null  78
      null  HondaAccord  33
      null     HondaCRV  10
      null   HondaCivic  35
    Dublin         null  33
    Dublin  HondaAccord  10
    Dublin     HondaCRV   3
    Dublin   HondaCivic  20
   Fremont         null  32
   Fremont  HondaAccord  15
   Fremont     HondaCRV   7
   Fremont   HondaCivic  10
  San Jose         null  13
  San Jose  HondaAccord   8
  San Jose   HondaCivic   5

--Prepare data for ignore nulls example
> CREATE TEMP VIEW person (id, name, age) AS
   VALUES (100, 'Mary', NULL),
          (200, 'John', 30),
          (300, 'Mike', 80),
          (400, 'Dan' , 50);

--Select the first row in column age
> SELECT FIRST(age) FROM person;
  first(age, false)
 --------------------
  NULL

--Get the first row in column `age` ignore nulls,last row in column `id` and sum of column `id`.
> SELECT FIRST(age IGNORE NULLS), LAST(id), SUM(id) FROM person;
  first(age, true)    last(id, false)    sum(id)
 ------------------- ------------------ ----------
  30                  400                1000