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.执行结果


浙公网安备 33010602011771号