数据库版本 SQL Server Management Studio 2008
学生成绩表 Students_Achievement
学号 StudentID
姓名 Name
科目 Subiject
成绩 Achievement
考试时间 Time
学号 姓名 科目 成绩 考试时间
202201 张三 语文 110 2022/1/10
202201 张三 数学 125 2022/1/10
202201 张三 语文 99 2022/1/4
202201 张三 数学 105 2022/1/4
学号 姓名 科目 成绩 考试时间
202202 李四 语文 115 2022/1/9
202202 李四 数学 102 2022/1/9
202202 李四 语文 90 2022/1/5
202202 李四 数学 110 2022/1/5
学号 姓名 科目 成绩 考试时间
202203 王五 语文 120 2022/1/12
202203 王五 数学 114 2022/1/12
202203 王五 语文 100 2022/1/6
202203 王五 数学 80 2022/1/6
想得到的查询效果:
学号 姓名 科目 成绩 考试时间
202201 张三 数学 125 2022/1/10
202202 李四 数学 102 2022/1/9
202203 王五 数学 114 2022/1/12
谢谢指导!
SQL Server 2012 起,开始支持开窗函数,
select * from (
select sa.*,
row_number() over (partition by StudentID,Subiject order by Time desc) rn
from Students_Achievement as sa ) as a
where a.rn =1
但sqlserver2008不支持开窗函数,所以这个写起来会比较麻烦
select * from Students_Achievement where (StudentID,Subiject ,Time )
in (select StudentID,Subiject ,max(Time) from Students_Achievement
group by StudentID,Subiject );
还有没有人能提出一个更加简洁易懂的逻辑?
我想的是,反正已知考试时间和科目的话,SQL如下
SELECT STUDEENTID,NAME,SUBJECT,Achievement,TIME
FROM TABLE
WHERE SUBJECT='数学' AND TIME='2022-01-12';