Skip to main content

GROUP BY 子句

GROUP BY 子句将表中具有相同数据的行分组,从而消除这些组的输出和聚合中的冗余。

此外,分组列中具有匹配数据的所有元组(即属于同一分组的所有元组)都将被合并。分组列的值保持不变,并且可以使用聚合函数(如 COUNTSUMAVG 等)来合并任何其他列。

GROUP BY 子句位于 SELECT 语句中的 WHERE 子句之后,也可以位于可选的 ORDER BY 子句之前。

以下是 GROUP BY 子句的基本句法:

SELECT column_list
FROM table_name
WHERE [ conditions ]
GROUP BY column1, column2....columnN
ORDER BY column1, column2....columnN

如果你的目标是严格地生成仅附加数据的窗口计算结果,可以利用 emit-on-window-close 策略。该方法有助于避免不必要的计算。有关 emit-on-window-close 策略的更多信息,请参阅Emit on window close

可以在 GROUP BY 子句中使用多个列。

GROUP BY 的基本示例:

-- 计算每个部门每个职务的平均工资
SELECT department, job_title, AVG(salary)
FROM employees
GROUP BY department, job_title;

查询结果是一个包含部门、职务和平均工资的表。每一行表示唯一的部门和职务组合的平均工资。

GROUP BY GROUPING SETS()

使用 GROUPING SETS() 可以在单个查询中按多个列组织数据。GROUPING SETS 的每个子列表可以指定零个或多个列或表达式,且可以像直接处于 GROUP BY 子句中那样被解读。

有 GROUPING SETS
SELECT customer_id, product_category, SUM(order_amount) AS total_amount
FROM orders
GROUP BY GROUPING SETS ((customer_id, product_category), ());
没有 GROUPING SETS
SELECT customer_id, product_category, SUM(order_amount) AS total_amount
FROM orders
GROUP BY customer_id, product_category
UNION ALL
SELECT NULL, NULL, SUM(order_amount) AS total_amount
FROM orders;

GROUP BY ROLLUP()

GROUP BY ROLLUP() 子句可扩展 GROUP BY 子句的功能,提供了一种为多级分组生成小计和总计的方法。它创建的结果集包括代表不同分组列的行,以及小计和总计。

GROUP BY ROLLUP 子句中的列定义了分组级别的层次结构,最右边的列是最详细的分组级别。

SELECT product_category, product_subcategory, region, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY ROLLUP (product_category, product_subcategory, region);

结果如下:

product_categoryproduct_subcategoryregiontotal_sales
ElectronicsSmartphonesNorth1000
ElectronicsSmartphonesSouth1500
ElectronicsSmartphonesNULL2500
ElectronicsLaptopsNorth2000
ElectronicsLaptopsSouth0
ElectronicsLaptopsNULL2000
ElectronicsNULLNULL4500
FurnitureChairsNorth500
FurnitureChairsSouth700
FurnitureChairsNULL1200
FurnitureTablesNorth1000
FurnitureTablesSouth1200
FurnitureTablesNULL2200
FurnitureNULLNULL3400
NULLNULLNULL7900

在此示例中,每个 product_categoryproduct_subcategoryregion 的组合都有小计。分组列中的 NULL 值表示总计。

GROUP BY CUBE()

GROUP BY CUBE() 子句可在单个查询中生成多级分组。创建的结果集包括指定列的所有可能组合,并为每个组合生成一个小计。

若需要分析多个维度的数据,并希望同时检查不同层次的聚合时,GROUP BY CUBE() 子句特别有用。

GROUP BY CUBE 子句
GROUP BY CUBE(c1,c2,c3) 
等效的 GROUP BY GROUPING SETS 子句
GROUP BY GROUPING SETS (
(c1,c2,c3),
(c1,c2),
(c1,c3),
(c2,c3),
(c1),
(c2),
(c3),
()
)
...