我正在尝试查找具有最大日期的记录,这很容易,但是当我想要其他的字样时,它是行不通的。
我有3张桌子。
表1 =学生。
Columns STid, STname
Value 1, John
2, Bob Lee
3, Jane
表2 =测试。
Columns Testid, STid, Date, Grade
Value 1, 1, 20/05/2018, A
2, 2, 20/05/2018, B
3, 3, 20/05/2018, D
4, 1, 30/06/2018, C
5, 2, 30/06/2018, C
6, 3, 30/06/2018, B
我想要的是最近一次考试中每个学生的成绩。
输出应为..
Columns STname, Date, Grade
Value John, 1, 30/06/2018, C
Bob Lee, 2, 30/06/2018, C
Jane, 3, 30/06/2018, B
当我尝试以下内容时,它可以正常工作,但我需要成绩。
SELECT STNAME, MAX(T.DATE)
FROM STUDENT S, TEST T
WHERE S.STID = T.STID
GROUP BY STNAME
不幸的是,以下内容不起作用。
SELECT STNAME, MAX(T.DATE), T.GRADE
FROM STUDENT S, TEST T
WHERE S.STID = T.STID
GROUP BY STNAME
或者下面的只是带回所有东西。
SELECT STNAME, MAX(T.DATE), T.GRADE
FROM STUDENT S, TEST T
WHERE S.STID = T.STID
GROUP BY STNAME, T.GRADE.
我怀疑答案是subquery
,但我也无法使它起作用。
SELECT STNAME, T.DATE, T.GRADE
FROM STUDENT S, TEST T
WHERE S.STID = T.STID
AND T.DATE = (SELECT MAX(T.DATE)
FROM STUDENT S, TEST T
WHERE S.STID = T.STID )
OR
SELECT STNAME, T.DATE, T.GRADE
FROM STUDENT S, TEST T
WHERE S.STID = T.STID
AND T.DATE = (SELECT MAX(T2.DATE)
FROM STUDENT S2, TEST T2
WHERE S.STID = S2.STID )
任何帮助表示赞赏。
答案 0 :(得分:3)
您需要row_number()
函数:
select t.*
from (select s.stid, s.STname, t.Date, t.Grade,
row_number() over (partition by s.stid order by t.date desc) as seq
from student s inner join
test t
on t.stid = s.stid
) t
where seq = 1;
答案 1 :(得分:2)
SQL Server还支持这种类型的问题的横向联接。这些通常比使用窗口功能具有更好的性能:
select s.*, t.date, t.grade
from student s outer apply
(select top (1) t.*
from test t
where t.stid = s.stid
order by t.date desc
) t;