哎呀212 2021-04-04 12:35 采纳率: 0%
浏览 186

求每个课程分数最高的前三名学生(考虑分数相同的情况) 用hive 的开窗函数

  
有三份源数据文件,如下所示,请根据需求,编写对对那个的HQL语句。
文件1: 学生表student <学号sid,姓名sname,性别ssex,年龄sage,系department> 
95001,李勇,男,20,CS
95002,刘晨,女,19,IS
95003,王敏,女,22,MA
95004,张立,男,19,IS
95005,刘刚,男,18,MA
95006,赵丽,女,20,CS

文件2: 成绩表score <学生编号sid,课程编号cid,成绩sscore>
95001,1,81
95001,2,85
95001,3,88
95001,4,70
95002,1,90
95002,2,80
95002,3,90
95002,4,80
95003,1,70
95003,2,78
95003,3,65
95003,4,65
95004,1,70
95004,2,90
95004,3,85
95004,4,90
95005,1,70
95005,2,90
95005,3,70
95005,4,90
95006,1,70
95006,2,90
95006,3,70
95006,4,90

select * from score 

文件3: 课程表course<课程编号cid,课程名cname>
1,数据库
2,数学
3,信息系统
4,操作系统

  • 写回答

1条回答 默认 最新

  • 憧憬blog 2023-03-14 22:43
    关注

    可以使用Hive的开窗函数来求每个课程分数最高的前三名学生。具体的HQL语句如下:

    SELECT c.cname, s.sname, s.sscore 
    FROM (
        SELECT cid, sname, sscore, 
            ROW_NUMBER() OVER(PARTITION BY cid ORDER BY sscore DESC) as rank
        FROM score
    ) s
    JOIN course c ON s.cid = c.cid
    WHERE s.rank <= 3
    ORDER BY c.cname, s.sscore DESC;
    

    上述HQL语句中,首先在成绩表score中使用开窗函数ROW_NUMBER(),对每个课程按照成绩降序排列,生成每个学生在该课程中的排名(rank)。然后,将该结果集与课程表course进行JOIN操作,将课程名cname与学生姓名sname、成绩sscore联合在一起。最后,按照课程名和成绩降序排列,筛选出每个课程排名前三位的学生信息。

    评论

报告相同问题?

悬赏问题

  • ¥30 comsol仿真等离激元
  • ¥15 静电纺丝煅烧后如何得到柔性纤维
  • ¥15 (标签-react native|关键词-镜像源)
  • ¥100 照片生成3D人脸视频
  • ¥15 伪装视频时长问题修改MP4的时长问题,
  • ¥15 JETSON NANO
  • ¥15 VS开发qt时如何在paintgl函数中用pushbutton控制切换纹理
  • ¥20 关于 openpyxl 处理excel文件地问题
  • ¥15 MS中不知道高分子的构型怎么构建模型
  • ¥60 QQOP数据,什么是op数据号,怎么提取op数据!能不能大量提取(语言-c语言)