HiveSQL 聚合技巧——grouping sets、cube、rollup

grouping sets

grouping sets() 在 group by 查询中,根据不同的维度组合进行聚合,等价于将不同维度的 group by 结果集进行 union all。聚合规则在括号中进行指定。

问题1:同时获取用户的性别分布、城市分布、等级分布

select sex,
    city,
    level,
    count(distinct user_id)
from 
    user_info
group by sex,city,level
grouping sets (sex,city,level);

问题2:同时获取用户的性别分布以及每个性别的城市分布

select sex,
    city,
    count(distinct user_id),
    grouping__id
from user_info
group by sex,city
grouping sets(sex,(sex,city));

grouping__id : (两个下划线) 结果属于哪一个分组集合

运行结果:

sexcity_c2grouping__id
femaleNULL1771
femalebeijing260
femalechangchun320
femaleguangzhou300
femalehangzhou300
femaleshanghai360
femaleshenzhen230
maleNULL1501
malebeijing270
malechangchun210
maleguangzhou250
malehangzhou270
maleshanghai250
maleshenzhen250

cube

根据 group by 维度的所有组合进行聚合

问题:性别、城市、等级的各种组合的用户分布

select sex,
    city,
    level,
    count(distinct user_id)
from user_info
group by sex,city,level
with cube;

rollup

以最左侧的维度为主,进行层级聚合,是 cube 的子集

问题:同时计算每个月的支付金额,以及每年的总支付金额

select year(dt) as year,
    month(dt) as month,
    sum(pay_amount) as pay_total
from user_trade
where dt > "0"
group by year(dt),month(dt)
with rollup;

这里的 user_trade 是分区表,分区字段是 dt

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值