分组 (GROUPING)
GROUPING
ROLLUP 和 CUBE 是对 GROUP BY 的修饰符。这两者都计算小计。ROLLUP 采用一个有序的列列表,例如 (day, month, year)
,并在聚合的每个级别计算小计,然后计算总计。CUBE 计算指定列的所有可能组合的小计。GROUPING 用于识别由 ROLLUP 或 CUBE 返回的哪些行是超级聚合,而哪些行是未修改的 GROUP BY 将返回的行。
GROUPING 函数接受多个列作为参数,并返回一个位掩码。
1
表示由ROLLUP
或CUBE
修饰符返回的行是小计0
表示由ROLLUP
或CUBE
返回的行不是小计
分组集 (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 示例更合适,因为它将 distro
和 version
组合在同一个集合中。
备注
在上面的示例中,版本在未与发行版关联时可能没有意义,如果我们跟踪内核版本,可能会有意义,因为内核版本可以与任一发行版关联。使用 GROUPING SETS,如下一个示例,可能是一个更好的选择。