GROUP BY 子句
GROUP BY
子句将表中具有相同数据的行分组,从而消除这些组的输出和聚合中的冗余。
此外,分组列中具有匹配数据的所有元组(即属于同一分组的所有元组)都将被合并。分组列的值保持不变,并且可以使用聚合函数(如 COUNT
、SUM
、AVG
等)来合并任何其他列。
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
子句中那样被解读。
SELECT customer_id, product_category, SUM(order_amount) AS total_amount
FROM orders
GROUP BY GROUPING SETS ((customer_id, product_category), ());
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_category | product_subcategory | region | total_sales |
---|---|---|---|
Electronics | Smartphones | North | 1000 |
Electronics | Smartphones | South | 1500 |
Electronics | Smartphones | NULL | 2500 |
Electronics | Laptops | North | 2000 |
Electronics | Laptops | South | 0 |
Electronics | Laptops | NULL | 2000 |
Electronics | NULL | NULL | 4500 |
Furniture | Chairs | North | 500 |
Furniture | Chairs | South | 700 |
Furniture | Chairs | NULL | 1200 |
Furniture | Tables | North | 1000 |
Furniture | Tables | South | 1200 |
Furniture | Tables | NULL | 2200 |
Furniture | NULL | NULL | 3400 |
NULL | NULL | NULL | 7900 |
在此示例中,每个 product_category
、product_subcategory
和 region
的组合都有小计。分组列中的 NULL 值表示总计。
GROUP BY CUBE()
GROUP BY CUBE()
子句可在单个查询中生成多级分组。创建的结果集包括指定列的所有可能组合,并为每个组合生成一个小计。
若需要分析多个维度的数据,并希望同时检查不同层次的聚合时,GROUP BY CUBE()
子句特别有用。
GROUP BY CUBE(c1,c2,c3)
GROUP BY GROUPING SETS (
(c1,c2,c3),
(c1,c2),
(c1,c3),
(c2,c3),
(c1),
(c2),
(c3),
()
)
...