You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SQL查询筛选出最新年份成绩优于往年的学生?

筛选最新年份成绩优于往年的学生记录

需求

仅输出那些在各自最新年份中成绩优于往年的学生信息。

现有数据表

student|Year|Marks
ABC|2023|98
XYZ|2021|100
MNO|2019|81
XYZ|2020|98
MNO|2018|98
ABC|2022|100

预期结果

XYZ|2021|100

尝试的SQL查询

with cte as 
  (select *, row_number() over (partition by name, year order by marks) as rn
   from table1)

select name, year, marks
from CTE
where rn = 1 

当前问题

上面的查询没法实现跨年份的成绩对比,筛选不出符合要求的记录。

正确解法

要搞定这个需求,得先找到每个学生的最新年份成绩,再判断这个成绩是不是比他所有往年的成绩都高。这里给两种可行的写法:

方法一:窗口函数实现

WITH student_year_stats AS (
    SELECT 
        student,
        Year,
        Marks,
        -- 拿到每个学生的最新年份
        MAX(Year) OVER (PARTITION BY student) AS latest_year,
        -- 计算每个学生往年成绩的最大值(排除最新年份)
        MAX(CASE WHEN Year != MAX(Year) OVER (PARTITION BY student) THEN Marks END) OVER (PARTITION BY student) AS max_prev_marks
    FROM table1
)
SELECT student, Year, Marks
FROM student_year_stats
-- 只留最新年份的记录,且成绩要比往年最高还高
WHERE Year = latest_year AND Marks > max_prev_marks;

方法二:子查询实现

SELECT t1.student, t1.Year, t1.Marks
FROM table1 t1
-- 先定位到每个学生的最新年份记录
WHERE t1.Year = (SELECT MAX(Year) FROM table1 WHERE student = t1.student)
-- 再判断该记录的成绩是否高于该学生所有往年的成绩
AND t1.Marks > (SELECT MAX(Marks) FROM table1 WHERE student = t1.student AND Year < t1.Year);

这两种写法都能得到预期结果,核心逻辑就是先锁定每个学生的最新记录,再和他自己的历史成绩做对比。

内容的提问来源于stack exchange,提问作者Stark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:42:16