跳转到主要内容

GROUPING

ROLLUPCUBEGROUP BY 的修饰符。两者都会计算小计。ROLLUP 接收一个有序列列表,例如 (day, month, year),并计算聚合各个层级的小计,最后再计算总计。CUBE 则会针对指定列的所有可能组合计算小计。GROUPING 用于标识 ROLLUP 或 CUBE 返回的行中,哪些是超级聚合行,哪些是普通 GROUP BY 会返回的行。 GROUPING 函数接受多个列作为参数,并返回一个位掩码。
  • 1 表示由 GROUP BYROLLUPCUBE 修饰符返回的某一行是小计
  • 0 表示由 ROLLUPCUBE 返回的某一行不是小计

GROUPING SETS

默认情况下,CUBE 修饰符会对传递给 CUBE 的列的所有可能组合计算小计。GROUPING SETS 允许你指定要计算的具体组合。 分析层次结构数据是 ROLLUP、CUBE 和 GROUPING SETS 修饰符的一个典型应用场景。这里的示例是一个表,其中包含两个数据中心中安装的 Linux 发行版及其版本的数据。按发行版、版本和位置查看这些数据可能很有价值。

加载示例数据

基础查询

按发行版统计各数据中心的服务器数量:

比较多个 GROUP BY 语句与 GROUPING SETS

在不使用 CUBE、ROLLUP 或 GROUPING SETS 的情况下拆分数据:
通过 GROUPING SETS 获取相同的信息:

比较 CUBE 与 GROUPING SETS

下一个查询中的 CUBE:CUBE(datacenter,distro,version) 提供了一个可能并不合理的层次结构。跨两个发行版查看 Version 并没有意义 (因为 Arch 和 RHEL 的发布周期和版本命名标准并不相同) 。紧接着的 GROUPING SETS 示例更合适,因为它将 distroversion 归为同一组。
上述示例中的版本号如果不与某个发行版关联,可能就没有实际意义;如果我们跟踪的是内核版本,这样可能更合理,因为内核版本既可以与任一发行版关联。像下一个示例那样使用 GROUPING SETS,可能是更好的选择。
最后修改于 2026年6月10日