返回介绍

solution / 1100-1199 / 1112.Highest Grade For Each Student / README

发布于 2024-06-17 01:03:23 字数 2386 浏览 0 评论 0 收藏 0

1112. 每位学生的最高成绩

English Version

题目描述

表: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  |
+------------+-----------+-------+

解法

方法一:RANK() OVER() 窗口函数

我们可以使用 RANK() OVER() 窗口函数,按照每个学生的成绩降序排列,如果成绩相同,按照课程号升序排列,然后取每个学生排名为 $1$ 的记录。

# Write your MySQL query statement below
WITH
  T AS (
    SELECT
      *,
      RANK() OVER (
        PARTITION BY student_id
        ORDER BY grade DESC, course_id
      ) AS rk
    FROM Enrollments
  )
SELECT student_id, course_id, grade
FROM T
WHERE rk = 1
ORDER BY student_id;

方法二:子查询

我们可以先查询每个学生的最高成绩,然后再查询每个学生的最高成绩对应的最小课程号。

# Write your MySQL query statement below
SELECT student_id, MIN(course_id) AS course_id, grade
FROM Enrollments
WHERE
  (student_id, grade) IN (
    SELECT student_id, MAX(grade) AS grade
    FROM Enrollments
    GROUP BY 1
  )
GROUP BY 1
ORDER BY 1;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文