hive 增强聚合函数 with rollup

hive 增强聚合函数 with rollup

现有一张课程选修表score_rollup,共有7名同学,他们选修的课程和课程所考成绩如下

c_names_names_sexs_score
数学赵雷90
数学钱电60
数学孙风80
数学李云30
数学周梅87
数学郑竹89
英语赵雷99
英语钱电80
英语孙风80
英语李云20
英语吴兰34
英语郑竹98
语文赵雷80
语文钱电70
语文孙风80
语文李云50
语文周梅76
语文吴兰31

数据&建表

create table score_rollup
(
    c_name  string,
    s_name  string,
    s_sex   string,
    s_score int
);

insert overwrite table score_rollup
values ('数学', '赵雷', '男', 90),
       ('数学', '钱电', '男', 60),
       ('数学', '孙风', '男', 80),
       ('数学', '李云', '男', 30),
       ('数学', '周梅', '女', 87),
       ('数学', '郑竹', '女', 89),
       ('英语', '赵雷', '男', 99),
       ('英语', '钱电', '男', 80),
       ('英语', '孙风', '男', 80),
       ('英语', '李云', '男', 20),
       ('英语', '吴兰', '女', 34),
       ('英语', '郑竹', '女', 98),
       ('语文', '赵雷', '男', 80),
       ('语文', '钱电', '男', 70),
       ('语文', '孙风', '男', 80),
       ('语文', '李云', '男', 50),
       ('语文', '周梅', '女', 76),
       ('语文', '吴兰', '女', 31);

需求:求每门课程男生和女生各有多少人选修,以及每门课程男生和女生的平均分;每门课程共有多少人选修、以每门课程及平均分;所有课程选修总人数,以及所有课程总平均分(不考虑此指标是否有意义)

如果不用with rollup,怎么求解?

  1. 求各门课程男生和女生各有多少人选修,以及该门课程男生和女生的平均分
select c_name,
       s_sex,
       count(1)     as cnt,
       avg(s_score) as avg
from score_rollup
group by c_name, s_sex
order by c_name
c_names_sexcntavg
数学465
数学288
英语266
英语469.75
语文253.5
语文470
  1. 每门课程共有多少人选修、以每门课程及平均分
select c_name,
       count(1) as cnt,
       round(avg(s_score),2) as avg
from score_rollup
group by c_name
c_namecntavg
数学672.67
英语668.5
语文664.5
  1. 所有课程选修总人数,以及所有课程总平均分
select count(c_name) as cnt,
       round(avg(s_score)) as avg
from score_rollup

如果用with rollup,怎么求解?

select c_name,
       s_sex,
       count(1) as cnt_num,
       avg(s_score)  as avg_score
from score_rollup
group by c_name, s_sex
with rollup
order by c_name,s_sex

在这里插入图片描述

总结:with rollup主要和分组的深度有关,若group by c_name, s_sex是2级深度,聚合时先按2级深度(group by c_name, s_sex)进行聚合,在按1级深度(group by c_name)进行聚合, 最后按按0级深度(group 空)进行聚合(我的用词可能不准确)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值