Leetcode 3421. 查找进步的学生

1.题目基本信息

1.1.题目描述

表:Scores

+-------------+---------+

| Column Name | Type |

+-------------+---------+

| student_id | int |

| subject | varchar |

| score | int |

| exam_date | varchar |

+-------------+---------+

(student_id, subject, exam_date) 是这张表的主键。

每一行包含有关学生在特定考试日期特定科目成绩的信息。分数范围从 0 到 100(包括边界)。

编写一个解决方案来查找 进步的学生。如果 同时 满足以下两个条件,则该学生被认为是进步的:

  • 在 同一科目 至少参加过两个不同日期的考试。

  • 他们在该学科 最近的分数 比他们 第一次该学科考试的分数更高。

返回结果表以 student_id,subject 升序 排序。

1.2.题目地址

https://leetcode.cn/problems/find-students-who-improved/description/

2.解题方法

2.1.解题思路

窗口函数FIRST_VALUE+分组聚合

2.2.解题步骤

第一步,使用窗口函数FIRST_VALUE获取各个学生和学科在最早和最晚的考试日期的考试分数,分别记为字段first_score和last_score,表格记为T1

第二步,基于T1,根据student_id和subject进行分组聚合,此时的每个学生、学科的first_score相同且last_score也相同,则只需使用MAX/MIN进行聚合筛选即可

3.解题代码

sql代码

# Write your MySQL query statement below

# 第一步,使用窗口函数FIRST_VALUE获取各个学生和学科在最早和最晚的考试日期的考试分数,分别记为字段first_score和last_score,表格记为T1
WITH T1 AS (
    SELECT 
        student_id, subject, 
        FIRST_VALUE(score) OVER (PARTITION BY student_id, subject ORDER BY exam_date) AS first_score, 
        FIRST_VALUE(score) OVER (PARTITION BY student_id, subject ORDER BY exam_date DESC) AS last_score
    FROM Scores
)
# 第二步,基于T1,根据student_id和subject进行分组聚合,此时的每个学生、学科的first_score相同且last_score也相同,则只需使用MAX/MIN进行聚合筛选即可
SELECT 
    student_id, 
    subject, 
    MIN(first_score) AS first_score, 
    MIN(last_score) AS latest_score
FROM T1 
GROUP BY student_id, subject
HAVING MIN(first_score) < MAX(last_score)
ORDER BY student_id, subject

4.执行结果

posted @ 2025-07-03 09:42  Geek0070  阅读(14)  评论(0)    收藏  举报