当前位置: 首页 > news >正文

LeetCode_sql_day22(1112.每位学生的最高成绩)

描述:1112.每位学生的最高成绩

表:Enrollments

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| student_id    | int     |
| course_id     | int     |
| grade         | int     |
+---------------+---------+
(student_id, course_id) 是该表的主键(具有唯一值的列的组合)。
grade 不会为 NULL。

编写解决方案,找出每位学生获得的最高成绩和它所对应的科目,若科目成绩并列,取 course_id 最小的一门。查询结果需按 student_id 增序进行排序。

查询结果格式如下所示。

示例 1:

输入:
Enrollments 表:
+------------+-------------------+
| student_id | course_id | grade |
+------------+-----------+-------+
| 2          | 2         | 95    |
| 2          | 3         | 95    |
| 1          | 1         | 90    |
| 1          | 2         | 99    |
| 3          | 1         | 80    |
| 3          | 2         | 75    |
| 3          | 3         | 82    |
+------------+-----------+-------+
输出:
+------------+-------------------+
| student_id | course_id | grade |
+------------+-----------+-------+
| 1          | 2         | 99    |
| 2          | 2         | 95    |
| 3          | 3         | 82    |
+------------+-----------+-------+

数据准备:

Create table If Not Exists Enrollments (student_id int, course_id int, grade int)
Truncate table Enrollments
insert into Enrollments (student_id, course_id, grade) values ('2', '2', '95')
insert into Enrollments (student_id, course_id, grade) values ('2', '3', '95')
insert into Enrollments (student_id, course_id, grade) values ('1', '1', '90')
insert into Enrollments (student_id, course_id, grade) values ('1', '2', '99')
insert into Enrollments (student_id, course_id, grade) values ('3', '1', '80')
insert into Enrollments (student_id, course_id, grade) values ('3', '2', '75')
insert into Enrollments (student_id, course_id, grade) values ('3', '3', '82');

分析:

①根据每个学生分组 根据分数降序  分数相同根据课程号升序排名

select *, 
                   row_number() 
                           over (partition by student_id order by grade desc,course_id) r1 
            from Enrollments

②取排名为1 的数据

select *, row_number() over (partition by student_id order by grade desc,course_id) r1
from Enrollments;

代码:

with t1 as (select *, row_number() over (partition by student_id order by grade desc,course_id) r1 from Enrollments)
select student_id, course_id, grade
from t1
where r1 = 1;

总结:

设置一个排名开窗函数 使用row_number 避免重复  按照分数优先 然后课程其次的优先级排名


http://www.mrgr.cn/news/23739.html

相关文章:

  • 鸿蒙开发前景
  • 并发编程:AQS(上)
  • Linux 安装神州通用数据库 ShenTong7.0.8_342.92_linux64
  • uniapp登录页面( 适配:pc、小程序、h5)
  • vue3数据持久化方案:pinia-plugin-persistedstate源码浅析
  • 若依Ruoyi之智能售货机运营管理系统(新增运营运维工单管理)
  • 如何在guitarpro中新建六线谱和简谱并实现简谱在下方?
  • 数据结构应用实例(二)——K均值聚类
  • Vue+SpringBoot+数据库整体开发流程 1
  • Qml 实现水波进度动画条
  • [笔记] 电机工作制以及软硬特性的本质推导
  • LeetCode之高频SQL50题
  • Vue2+JS项目升级为Vue3+TS之jquery的maphilight引入项目(附使用)
  • python如何获取html中的所有链接
  • 儿童护眼灯哪个牌子好?五款眼科医生推荐的台灯分享
  • 诸葛io:消费金融行业智能运营与数智化经营模型构建
  • Kotlin入门实用开发技巧与注意事项
  • YOLOv5 目标计数 | 图片上绘制计数结果
  • “深入解析:MySQL半同步复制的配置指南与实践技巧“
  • 俄罗斯电商没有技巧,OZON换季相关爆品