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 空)进行聚合(我的用词可能不准确)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Hive 支持多种聚合函数,如 COUNT、SUM、AVG、MAX、MIN 等。使用聚合函数可以对表中的数据进行统计和分析。 以下是使用 Hive 实现聚合函数的语法: ``` SELECT function(column_name) FROM table_name WHERE condition GROUP BY column_name; ``` 其中,function 是聚合函数名称,column_name 是要进行聚合操作的列名,table_name 是表名,condition 是筛选条件,GROUP BY 子句用于分组聚合。在 GROUP BY 子句中指定的列名将会根据相同的值进行分组,然后对每个分组应用聚合函数。 举个例子,如果我们要统计每个部门的员工人数和平均工资,可以使用以下语句: ``` SELECT department, COUNT(*) AS count, AVG(salary) AS avg_salary FROM employee GROUP BY department; ``` 这里使用了 COUNT 和 AVG 两个聚合函数,分别统计了每个部门的员工人数和平均工资,并使用 AS 关键字对列名进行了重命名。 需要注意的是,在使用聚合函数时,除了使用 GROUP BY 子句进行分组聚合外,还可以使用 HAVING 子句进行筛选。HAVING 子句用于在分组后对分组进行筛选,只返回符合条件的分组。例如,如果我们只想返回员工人数大于等于 5 的部门信息,可以使用以下语句: ``` SELECT department, COUNT(*) AS count FROM employee GROUP BY department HAVING count >= 5; ``` 这里使用了 COUNT 聚合函数统计了每个部门的员工人数,并在 HAVING 子句中对 count 进行了筛选。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值