深入理解 SQL 中的 Grouping Sets 语句

深入理解 SQL 中的 Grouping Sets 语句
最新回答
昔年°c

2020-08-14 00:41:50

SQL 中的 Grouping Sets 语句是一种高级分组操作,允许同时计算多个不同维度的聚合结果,相当于多个 GROUP BY 组合的 UNION ALL 的简写形式。

  • 基本功能:Grouping Sets 指定多个分组规则,一次性计算不同维度的聚合结果。例如:

    SELECT city, car_model, sum(quantity) FROM dealer GROUP BY GROUPING SETS ((city, car_model), (city), (car_model), ())

    等价于分别按 (city, car_model)、(city)、(car_model) 和全局聚合后通过 UNION ALL 合并结果。

  • 执行计划对比

    Union All 版本:每个分组规则生成独立的子查询,分别扫描表、投影列、聚合神空友,最后合并结果。

    Grouping Sets 版本:通过 Expand 操作生成多组分组键,单次扫描表后按不同维亏燃度聚合,避免重复扫描。

  • 关键特性

    高效性:底层优化为单次表扫描,而非多次扫描(如 Union All 方式)。

    结果标识:通过 GROUPING__ID 列标记结果所属的分组维度(如 0 表示 (city, car_model) 分组)。

    空值处理:未参与分组的列在结果中显示为 NULL,全局聚合结果中所有分组列均为 NULL。

  • 应用场景

    多维度数据分游槐析(如同时查看城市、车型及两者的交叉统计)。

    替代多个独立查询,简化代码并提升性能。

  • 与 RollUp/Cube 的关系

    RollUp:生成层级分组(如 (a,b)、(a)、()),是 Grouping Sets 的子集。

    Cube:生成所有可能的分组组合(如 (a,b)、(a)、(b)、()),基于 Grouping Sets 实现。

示例结果解析

  • (city=NULL, car_model=NULL, sum=78):全局聚合结果。
  • (city="Dublin", car_model=NULL, sum=33):按城市分组的聚合。
  • (city=NULL, car_model="Honda Civic", sum=35):按车型分组的聚合。

总结:Grouping Sets 通过单次操作实现多维度聚合,提升效率且代码简洁,是 OLAP 分析中强大的工具。