为何使用ROLLUP时grouping_id的总计层级为3而非2?
ROLLUP分组中总计行grouping_id为3的逻辑依据解析
示例数据
| col1 | col2 |
|---|---|
| id1 | 1 |
| id1 | 2 |
| id2 | 1 |
| id2 | 2 |
| id3 | 1 |
| id3 | 2 |
先明确CUBE的grouping_id逻辑
CUBE会生成所有维度组合的聚合,对应的grouping_id用二进制位标记维度是否被聚合(1表示该维度被聚合,0表示保留):
- level 0(二进制
00):基础明细聚合,保留col1和col2的具体值,比如(id1,1)这类组合 - level 1(二进制
01):仅聚合col2,保留col1的具体值,比如id1的小计(col1=id1,col2被聚合) - level 2(二进制
10):仅聚合col1,保留col2的具体值,比如col2=1的小计(col2=1,col1被聚合) - level 3(二进制
11):聚合所有维度,也就是全量数据的总计
ROLLUP直接跳到level3的原因
ROLLUP是层级式递进聚合,它只会按指定维度顺序,从右往左依次去掉维度生成聚合组,不会生成所有可能的维度组合。比如用ROLLUP(col1, col2)时,只会生成三种聚合组:
- 保留所有维度:
(col1, col2)→ grouping_id二进制00(值0) - 去掉最右侧的col2,保留col1:
(col1)→ grouping_id二进制01(值1) - 去掉所有维度:
()→ grouping_id二进制11(值3)
因为ROLLUP不会单独聚合col1而保留col2(也就是不会生成(col2)这种聚合组),所以对应的二进制10(值2)的grouping_id就不会出现,看起来像是从level 0/1直接跳到了level3。这完全是grouping_id的二进制编码规则结合ROLLUP的层级聚合特性导致的结果,是既定的逻辑规则。
内容的提问来源于stack exchange,提问作者Gal Mor
相关产品推荐
相关产品推荐

