GROUPING
GROUPING
ROLLUP 和 CUBE 是 GROUP BY 的修饰符。这两者都会计算小计。ROLLUP 接受一个有序的列列表,例如 (day, month, year)
,并在每个聚合级别计算小计,然后计算总计。CUBE 计算指定列的所有可能组合的小计。GROUPING 用于识别 ROLLUP 或 CUBE 返回的哪些行是超聚合,并指明哪些是未修改的 GROUP BY 将返回的行。
GROUPING 函数接受多个列作为参数,并返回一个位掩码。
1
表示由ROLLUP
或CUBE
修饰的GROUP BY
返回的行是小计。0
表示由ROLLUP
或CUBE
返回的行不是小计。
GROUPING SETS
默认情况下,CUBE 修饰符为传递给 CUBE 的所有可能列组合计算小计。GROUPING SETS 允许您指定要计算的特定组合。
分析层次数据是使用 ROLLUP、CUBE 和 GROUPING SETS 修饰符的一个好用例。这里的示例是一个包含有关两个数据中心中安装的 Linux 发行版及其版本的数据表。按发行版、版本和位置查看数据可能是有价值的。
Load sample data
Simple queries
按发行版获取每个数据中心的服务器数量:
Comparing multiple GROUP BY statements with GROUPING SETS
在没有 CUBE、ROLLUP 或 GROUPING SETS 的情况下细分数据:
使用 GROUPING SETS 获取相同信息:
Comparing CUBE with GROUPING SETS
下一个查询中的 CUBE,CUBE(datacenter,distro,version)
提供了一个可能不合理的层次结构。在两个发行版之间查看版本是没有意义的(因为 Arch 和 RHEL 没有相同的发布周期或版本命名标准)。下面的 GROUPING SETS 示例更为合适,因为它将 distro
和 version
分组在同一集合中。
上述示例中的版本在未关联到发行版时可能没有意义,如果我们跟踪的是内核版本,那可能是合理的,因为内核版本可以与任一发行版相关联。使用 GROUPING SETS,如下一个示例,可能是更好的选择。