- 类别:
GROUP BY CUBE¶
GROUP BY CUBE 是 GROUP BY 子句的扩展,类似于 GROUP BY ROLLUP。与 ROLLUP 类似,CUBE 也会在多个级别上生成聚合行。但是,ROLLUP 创建的是遵循自然层次结构的聚合(例如,城市汇总到省/自治区/直辖市,省/自治区/直辖市汇总到国家/地区),而 CUBE 创建的是指定列的所有可能组合的聚合。这其中包括 ROLLUP 会产生的分层聚合,也包括额外的“交叉表”行,这类行会对每个独立维度分别进行聚合。
CUBE 可以与其他 GROUP BY 表达式组合。例如,您可以编写 GROUP BY x, CUBE(y, z) 以按照列 x 进行分组,并对 y 和 z 进行多维数据集聚合。
CUBE 分组等同于一系列分组集,本质上是一个较短的规范。CUBE 规范的 N 元素对应于 2^N GROUPING SETS。
另请参阅¶
:doc:`/sql-reference/functions/grouping`(用于确定生成每行的分组级别的工具函数)
语法¶
其中:
参数¶
使用说明¶
Snowflake 允许每个多维数据集中最多有 7 个元素(等同于 128 个分组集)。
示例¶
首先创建一个表,然后向其中加载一家连锁店的销售信息,该连锁店在不同的城市以及省/自治区/直辖市或地区设有分店。
运行多维数据集查询,按城市、省/自治区/直辖市以及所有省/自治区/直辖市的总和显示利润。下面的示例显示了一个具有三个“级别”的查询:
每个城市。
每个省/自治区/直辖市。
所有收入的总和。
此示例使用 ORDER BY state, city NULLS LAST 来确保每个省/自治区/直辖市的汇总紧跟在该省/自治区/直辖市的所有城市之后,并且最终汇总显示在输出的末尾。
某些汇总行包含 NULL 值。例如,表中的最后一行包含城市的 NULL 值和省/自治区/直辖市的 NULL 值,因为数据针对所有城市和省/自治区/直辖市,而不是针对特定的城市和省/自治区/直辖市。
GROUPING 实用函数可帮助区分多维数据集聚合产生的 NULL 值与数据中的实际 NULL 值。
GROUP BY CUBE 和 GROUP BY ROLLUP 都为每个城市/省/自治区/直辖市对生成一行,并且这两个 GROUP BY 子句还为每个单独的省/自治区/直辖市和所有省/自治区/直辖市的组合生成汇总行。这两个 GROUP BY 子句的区别在于,GROUP BY CUBE 还会为每个城市名称(Miami、SJ 等)生成一个输出行。
对分层数据使用 GROUP BY CUBE 时要小心。在此示例中,SJ 行包含 CA 州中名为 SJ 的城市和 PR 境内名为 SJ 的城市的总数,尽管这些城市之间的唯一关系是它们具有相同的名称。通常,GROUP BY ROLLUP 用于分析分层数据,GROUP BY CUBE 用于跨独立轴分析数据。