一文看懂hive中group by rollup/cube group by sets用法及区别(附案例)
有的放矢,先有需求,再有解决方案,直接上案例
测试表
分数表
CREATE TABLE TEST_GROUP(
name string comment '姓名',
syear string comment '学年',
course string comment '科目',
score int comment '分数');
测试数据
INSERT OVERWRITE TABLE TEST_GROUP VALUES
('李四','2020','数学','50'),
('李四','2020','语文','40'),
('李四','2019','语文','40'),
('钱琪','2020','数学','20'),
('钱琪','2021','语文','50'),
('狗勾','2020','语文','100');
GROUP BY用法
本文的基础,group by
需求一:
查询每名同学每个学年的总分数
分析:我们需要将相同名称,相同学年的数据放入一组,然后将分数汇总相加。
sql代码
SELECT
name,syear,
SUM(score) as sumscore
FROM test_group
GROUP BY name,syear;
结果
name | syear | sumscore |
---|---|---|
李四 | 2019 | 40 |
李四 | 2020 | 90 |
狗勾 | 2020 | 100 |
钱琪 | 2020 | 20 |
钱琪 | 2021 | 50 |
可以看到,group by根据分组key(name,syear)进行分组,通过聚合函数,将其他字段进行聚合,最终得出结果
需求二
1.查找 每名同学 每个学年 每个学科 的分数
2.查找 每名同学 每个学年 的总分
3.查找 每名同学 的总分
4.查找 所有记录 的总分
ps: 查询结果一次返回
这个需求我们用group by 可不可以实现呢?
当然可以,我们拆分来看
1.查找 每名同学 每个学年 每个学科 的分数
这个比较简单
SELECT
name,syear,course,
SUM(score) as sumscore
FROM test_group
GROUP BY name,syear,course;
结果
name | syear | course | sumscore |
---|---|---|---|
李四 | 2019 | 语文 | 40 |
李四 | 2020 | 数学 | 50 |
李四 | 2020 | 语文 | 40 |
狗勾 | 2020 | 语文 | 100 |
钱琪 | 2020 | 数学 | 20 |
钱琪 | 2021 | 语文 |