前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >hive sql(一)

hive sql(一)

作者头像
大数据最后一公里
发布于 2021-08-05 02:13:43
发布于 2021-08-05 02:13:43
79000
代码可运行
举报
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
每天分享一个sql,帮助大家找到sql的快乐

需求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
找出所有科目成绩都大于某一学科平均成绩的学生

建表语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create table score(
    uid string,
    subject_id string,
    score int
)
row format delimited fields terminated by '\t'
;

数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert overwrite table score values
("1001","01",100),
("1001","02",100),
("1001","03",100),
("1002","01",90),
("1002","02",70),
("1002","03",50),
("1003","01",80),
("1003","02",60),
("1003","03",40);

实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select
    t2.uid
from(
    select
        t1.uid,
        t1.subject_id,
        t1.score,
        t1.avg_score,
        if(t1.score > t1.avg_score,0,1) as flag --每科成绩大于某科平均分
    from(
        select
            uid,
            subject_id,
            score,
            cast(avg(score) over(partition by subject_id) as int) as avg_score
        from
            score
        )t1
    )t2
group by t2.uid
having sum(t2.flag)=0;

#结果
t2.uid
1001
Time taken: 33.267 seconds, Fetched: 1 row(s)

分析

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1、重点1是科目开窗求每个平均分,这样每个科目后面都会匹配对应的平均分
2、每一条数据都有学生每科的成绩和这个科目的平均分,可以直接判断科目成绩是否大于科目平均分
3、核心逻辑是flag处理,学生每科成绩大于所有科目的平均分,对于每个学生来说,只有一种情况,全部为0,
而每科成绩小于一科平均分便为1,这是一种反向思维
4、然后对flag求和,和为0就是符合要求的结果

扩展

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select
    uid,
    subject_id,
    score,
    round(avg(score) over(partition by subject_id),2) as avg_score
from
    score
;
uid  subject_id  score  avg_score
1003  01  80  90.0
1002  01  90  90.0
1001  01  100  90.0
1003  02  60  76.67
1002  02  70  76.67
1001  02  100  76.67
1003  03  40  63.33
1002  03  50  63.33
1001  03  100  63.33
Time taken: 14.056 seconds, Fetched: 9 row(s)


开窗的结果会根据分区键进行匹配,也就是说在原有的行记录再添加一列,
这个列的每一行的值是开窗结果集,结果集的在每一行的值是与分区键匹配
用程序语言表述一下:
rows[keys:values] -- 多个不同的key对应多个相同或不同的values
over(partition by key) --开窗是以key作为分区键来读取数据
key:values --分区之后,原有数据变成多个子集:一个key对应多个values
avg() over(partition by key)--对每个结果集进行运算
key:result -- 运算之后,一个key对应一个result
rows[keys:results] --最终展示的结果是在原有的数据不变+新增一列result

select
    subject_id,
    round(avg(score),2)
from
    score
group by subject_id
;
subject_id  _c1
01  90.0
02  76.67
03  63.33
Time taken: 24.313 seconds, Fetched: 3 row(s)

分组统计会根据分组键进行分组,找到分组键列和聚合函数作用的列,相当于从原始数据集中
取出两列,行数不变
【扩展】where条件会减少行数
然后根据分组键切分成多个数据集,每个数据集数据类型相同,然后使用聚合函数计算,返回结果
再与分组键组成kv结构,就是最终看到的效果
用程序语言表述一下:
rows[rows:cols] -- 原始数据集,多行多列
group by key -- 指定分组键,
select col1,col2 -- 取出多列,数据变成多行少列
group by key & select col1,聚合函数(key)-- 这里会忽略聚合函数作用列,比较select中的key是否是group by中的key的子集
avg(key) --对每个子集的数据计算,返回结果
key:result -- 运算之后,一个key对应一个result,这就是最终结果

对比:
1、over(partition by)和group by的效果都是分组统计
2、over是原始数据不变,新增一列,group by是从原始数据集中选出子集,只能看到结果,没有原始数据信息
3、over(partition by)效果=原始数据集 join group by原始数据集
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据最后一公里 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
(八)HQL手写题(1)
表结构:uid,subject_id,score 求:找出所有科目成绩都大于某一学科平均成绩的学生 数据集如下 1001 01 90 1001 02 90 1001 03 90 1002 01 85 1002 02 85 1002 03 70 1003 01 70 1003 02 70 1003 03 85 1)建表语句 create table score( uid string, subject_id string, score int) row format delimited fields terminated by '\t'; 2)求出每个学科平均成绩 select uid, score, avg(score) over(partition by subject_id) avg_score from score;t1 3)根据是否大于平均成绩记录flag,大于则记为0否则记为1 select uid, if(score>avg_score,0,1) flag from t1;t2 4)根据学生id进行分组统计flag的和,和为0则是所有学科都大于平均成绩 select uid from t2 group by uid having sum(flag)=0; 5)最终SQL select uid from (select uid, if(score>avg_score,0,1) flag from (select uid, score, avg(score) over(partition by subject_id) avg_score from score)t1)t2 group by uid having sum(flag)=0;
wolf
2020/09/21
6130
Hive SQL 大厂必考常用窗口函数及相关面试题
二、窗口函数的基本用法 1.基本语法 2.设置窗口的方法 1)window_name 2)partition by 子句 3) order by子句 4)rows 指定窗口大小 3.开窗函数中加order by 和 不加 order by的区别
王知无-import_bigdata
2022/11/11
3.8K0
Hive SQL 大厂必考常用窗口函数及相关面试题
大数据面试SQL042-所有考试科目的成绩都大于对应学科的平均成绩的学生
2)查询出“所有”科目都大于平均成绩的学生,这里的所有比较难处理,有个技巧:对每个学生的每个科目满足“成绩>科目平均成绩”的记录打0,不满足的打1,然后对学生所有科目标签求和,和为0则满足“所有科目都大于平均成绩”,和>0则不满足;
数据仓库晨曦
2024/02/27
3590
大数据面试SQL042-所有考试科目的成绩都大于对应学科的平均成绩的学生
HiveSQL-面试题034 不及格课程数大于2的学生的平均成绩及其排名
有学生每科科目成绩,求不及格课程数大于2的学生的平均成绩及其成绩平均值后所在的排名。
数据仓库晨曦
2024/01/08
2740
HiveSQL-面试题034 不及格课程数大于2的学生的平均成绩及其排名
一些sql用法例子【Updating】
1、利用instr连接表做字段查询,group_concat做值的合并: create table ab(product_id int,product_name varchar(10), product_type_id varchar(10)); insert into ab values(1,'产品A','1,2'),(2,'产品B','2,3'); create table ac(product_type_id int,product_type_name varchar(10)); insert
用户1177713
2018/02/24
1.8K0
SQL 进阶挑战(21 - 25)
现有用户信息表user_info(uid用户ID,nick_name昵称, achievement成就值, level等级, job职业方向, register_time注册时间),示例数据如下:
村雨遥
2022/06/20
4540
0基础学习PyFlink——用户自定义函数之UDTAF
在前面几篇文章中,我们分别介绍了UDF、UDTF和UDAF这三种用户自定义函数。本节我们将介绍最后一种函数:UDTAF——用户自定义表值聚合函数。
方亮
2023/10/28
2710
0基础学习PyFlink——用户自定义函数之UDTAF
玩转Mysql系列 - 第8篇:分组查询详解(group by & having)
where是在分组(聚合)前对记录进行筛选,而having是在分组结束后的结果里筛选,最后返回整个sql的查询结果。
路人甲Java
2019/09/17
8.8K1
MySQL数据库基础练习系列8、成绩录入与分析系统
很多学生或者说是初学者在学习完成数据库的基础增删改查后就自认为在数据库这里就很熟悉了,但是不接触项目根本部知道需求,我这里准备了50个项目的基本需求来让大家来熟练各类项目的列信息,让大家更好的深入项目进行实战式的练习,可以让大家在后面面试的时候有更多更丰富的资历让大家可以与面试官侃侃而谈。
红目香薰
2024/06/07
960
SQL数据分析实战:好用的窗口函数
感觉这个春节假期在除夕过完之后吧,时间就过的非常快了,余额已经明显不足了。嗯,是开始可以学习起来了!
可以叫我才哥
2022/04/12
7750
SQL数据分析实战:好用的窗口函数
SQL | 44道经典 SQL 笔试题与答案解析
--学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --课程表 Course(CId,Cname,TId) --CId 课程编号,Cname 课程名称,TId 教师编号 --教师表 Teacher(TId,Tname) --TId 教师编号,Tname 教师姓名 --成绩表 SC(SId,CId,score) --SId 学生编号,CId 课程编号,score 分数
咸鱼学Python
2020/04/08
10.4K0
SQL |  44道经典 SQL 笔试题与答案解析
互联网经典SQL面试题及答案解析
--学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --课程表 Course(CId,Cname,TId) --CId 课程编号,Cname 课程名称,TId 教师编号 --教师表 Teacher(TId,Tname) --TId 教师编号,Tname 教师姓名 --成绩表 SC(SId,CId,score) --SId 学生编号,CId 课程编号,score 分数
TOMOCAT
2020/06/09
1.4K0
MySQL50-6-第16-20题
学生信息:Student-------s_id,s_name,s_sex,s_birth
皮大大
2021/03/01
3820
MySQL50-6-第16-20题
MySQL学习,详解分组查询(二)
where & group by & having & order by & limit ⼀起协作
用户1289394
2021/10/26
1.8K0
【数据库】MySQL经典面试题(练习)
【数据库】MySQL经典面试题(练习) 一、删除除了学号字段以外,其它字段都相同的冗余记录,只保留一条!(也就是要删除凤姐和田七中一条重复数据只留一条) 要求结果数据: 原始数据: CREATE TA
Java帮帮
2018/03/15
1.7K0
【数据库】MySQL经典面试题(练习)
Hive-SQL查询每年总成绩都有所提升的学生
一张学生成绩表(student_scores),有year-学年,subject-课程,student-学生,score-分数这四个字段,请完成如下问题:
数据仓库晨曦
2024/01/08
2430
Hive-SQL查询每年总成绩都有所提升的学生
sql语句练习题整理
3)李四语文成绩被登记错误,成绩实际为85分,更新到考试信息表中,SQL语句怎么编写?
全栈程序员站长
2022/07/25
2750
经典SQL练习题(MySQL版)
网上有一篇关于SQL的经典文章,超经典SQL练习题,做完这些你的SQL就过关了,引用和分析它的人很多,于是今天复习SQL的时候找来练了练手。原作者用的是SQL Server 2008,我在这里用的是MySQL 8.0.11(二者语法差别不大),文本编辑器用的是Atom 1.28.2(不知道大家用什么,反正用Atom写SQL确实丝质顺滑)。
全栈程序员站长
2022/09/01
1.2K0
深夜小酌,50道经典SQL题,真香~
  现在是6月9号00:15分,花了近3小时撸完这小50题,有点困了,不想对所谓标准答案了。。心中有猛虎,何必细嗅蔷薇?
陈哈哈
2022/06/12
9450
深夜小酌,50道经典SQL题,真香~
MySQL高级查询
 高级查询     关键字书写顺序  关键字执行顺序 select:投影结果       1    5 from:定位到表             2    1 where:分组前第一道过滤       3    2 group by:分组                4    3 having:分组后第二道过滤             5    4 order by:排序                      6    6 limit:        最后 ---分页 * 目的:为了加快网站对
房上的猫
2018/03/14
3.3K0
相关推荐
(八)HQL手写题(1)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验