TSQL:最大日期,但包含其他变量

时间:2018-07-09 09:07:56

标签: sql sql-server tsql

我正在尝试查找具有最大日期的记录,这很容易,但是当我想要其他的字样时,它是行不通的。

我有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 )

任何帮助表示赞赏。

2 个答案:

答案 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;