参考链接:
SQL:
group by :
https://blog.csdn.net/make_1998/article/details/82938038
https://blog.csdn.net/weixin_44112790/article/details/117129217
https://www.cnblogs.com/chenzechao/p/11273980.html
【hive 】cube 和 roll up https://www.cnblogs.com/zzhangyuhang/p/9986506.html
group by:

group by rollup:

group by cube:

hive SQL:

group by: 是一个压缩过程
group by with cube:
参考:https://www.cnblogs.com/zzhangyuhang/p/9986506.html
cube(数据立方体),对多个维度进行聚合(group)
hive 也有 cube,实现多个任意维度的查询
1. cube(a,b,c) 首先对(a,b,c) 进行group by,
2. 然后依次是(a,b),(a,c),(a),(b,c),(b),©,最后对全表进行group by,会统计所选列中值的所有组合的聚合
3. cube 可以对所有维度进行聚合(group by)
select
col1,col2,col3, --维度字段
count(user_id), --聚合字段
GROUPING__ID, --聚合选取的组号(二进制表示,但是这里打印出来的是十进制)
rpad(reverse(bin(cast(GROUPING__ID AS bigint))),3,'0’) as sign --对其二进制化就能明白了,注意中间是两个下划线,因为在反转的时候会把末尾的0去掉,需要用rpad补充至维度个数
from table
group by col1,col2,col3 --维度字段都要出现在group by中,这里不能使用1,2,3代替
with cube; --使用cube函数

使用cube 聚合函数后,可以 根据 grouping_id(二进制表示形式【反向】)看出 当前 group by 字段维度:
如:sign = 100,表示只有col1一个维度 参与group by;
       sign = 110,表示只有 col1 和 col2 两个维度参与 group by

grouping by sets:
当不需要cube将所有维度都列出来的时候,只需要部分维度的时候,可以使用grouping sets
select
col1,col2,col3, --维度字段
count(user_id), --聚合字段
GROUPING__ID, --聚合选取的组号(二进制表示,但是这里打印出来的是十进制)
rpad(reverse(bin(cast(GROUPING__ID AS bigint))),3,‘0’) --对其二进制化就能明白了,注意中间是两个下划线,注意中间是两个下划线,因为在反转的时候会把末尾的0去掉,需要用rpad补充至维度个数
from table group by col1,col2,col3 --维度字段都要出现在group by中,并不能省略暂时不用到的字段,这里不能使用1,2,3,4代替
grouping sets(col1,(col2,col3)); --使用grouping sets来代替with cube

tips:
    使用grouping sets() 进行指定维度聚合的时候,仅仅聚合给出的维度组合,并不会自动帮你 组合维度
    如:grouping sets(col1, (col2,col3)) 只聚合 col1 维度和 (col2,col3)维度,并不会自动 聚合 (col1,col2,col3)维度

group by with rollup:
rollup 卷起,rollup是cube的子集,以最左侧维度为主,按照顺序依次进行聚合
如:聚合维度为:col1,col2,col3 使用rollup 聚合的字段分别为 col1, (col1,col2), (col1,col3), (col1,col2,col3)
select
col1,col2,col3,col4, --维度字段
count(user_id), --聚合字段
GROUPING__ID, --聚合选取的组号(二进制表示,但是这里打印出来的是十进制)
rpad(reverse(bin(cast(GROUPING__ID AS bigint))),4,‘0’) --对其二进制化就能明白了,注意中间是两个下划线,注意中间是两个下划线,因为在反转的时候会把末尾的0去掉,需要用rpad补充至维度个数
from table
group by col1,col2,col3,col4 --维度字段都要出现在group by中,这里不能使用1,2,3,4代替
with rollup; --使用rollup函数

结果分析:

    在 CUBE 或 ROLLUP 等操作中,所生成的 NULL 代表全体值,所以在cube 和 rollup 时,数据本身存在  null  的情况,需要将数据中的null  提前 处理。
    可使用 nvl(col1,’ALL’)  或者 COALESCE(col1, ‘ALL')

总结:

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐