跳到主要内容
跳到主要内容

分组 (GROUPING)

GROUPING

ROLLUPCUBE 是对 GROUP BY 的修饰符。这两者都计算小计。ROLLUP 采用一个有序的列列表,例如 (day, month, year),并在聚合的每个级别计算小计,然后计算总计。CUBE 计算指定列的所有可能组合的小计。GROUPING 用于识别由 ROLLUP 或 CUBE 返回的哪些行是超级聚合,而哪些行是未修改的 GROUP BY 将返回的行。

GROUPING 函数接受多个列作为参数,并返回一个位掩码。

  • 1 表示由 ROLLUPCUBE 修饰符返回的行是小计
  • 0 表示由 ROLLUPCUBE 返回的行不是小计

分组集 (GROUPING SETS)

默认情况下,CUBE 修饰符计算传递给 CUBE 的所有可能组合的小计。GROUPING SETS 允许你指定要计算的特定组合。

分析层级数据是 ROLLUP、CUBE 及 GROUPING SETS 修饰符的一个好用例。这里的示例是一个包含关于在两个数据中心安装了哪些 Linux 发行版及其版本的数据表。查看按发行版、版本和位置划分的数据可能很有价值。

加载示例数据

简单查询

按发行版获取每个数据中心中服务器的数量:

使用 GROUPING SETS 比较多个 GROUP BY 声明

在没有 CUBE、ROLLUP 或 GROUPING SETS 的情况下对数据进行细分:

使用 GROUPING SETS 获取相同的信息:

比较 CUBE 和 GROUPING SETS

下一个查询中的 CUBE,CUBE(datacenter,distro,version) 提供的层次结构可能没有意义。在两个发行版之间查看版本没有意义(因为 Arch 和 RHEL 没有相同的发布周期或版本命名标准)。后面的 GROUPING SETS 示例更合适,因为它将 distroversion 组合在同一个集合中。

备注

在上面的示例中,版本在未与发行版关联时可能没有意义,如果我们跟踪内核版本,可能会有意义,因为内核版本可以与任一发行版关联。使用 GROUPING SETS,如下一个示例,可能是一个更好的选择。