SQL Server为每个具有最高日期的学生获取一行

时间:2018-11-13 18:44:47

标签: sql sql-server row-number

我有两个表,如下所示: enter image description here

我想找到StudentId,FirstName,StudentLoginInfoId,LoginDate。我希望每个学生的LoginDate较高只能输入一个条目。

预期结果:

enter image description here

2 个答案:

答案 0 :(得分:0)

您可以使用ROW_NUMBER对子查询中每个分区(此处为每个学生)的结果集的输出编号,并通过将分配给每个学生的编号为1的条件来实现所需的输出将等于一行。

select studentid, firstname, studentlogininfoid, logindate
from (
  select 
    s.studentid, s.firstname, sl.studentlogininfoid, sl.logindate, 
    row_number() over (partition by sl.studentid order by sl.logindate desc) as rn
  from student s
  inner join studentlogininfoid sl on s.studentid = sl.studentid
) t
where rn = 1

解释row_number的参数:

  • PARTITION BY指定您要分别枚举的组(每个组从1开始)
  • ORDER BY指定应如何枚举行(基于顺序)

如果我们枚举每个学生的行并从最近的日期开始对其进行排序,则每个学生的第一行(带有rn = 1的行)将包含该学生的最高登录日期值。

答案 1 :(得分:0)

您可以使用“交叉申请”找到所需内容:

SELECT    S.StudentId
        , S.FirstName
        , SLI.StudentLoginInfoId
        , SLI.LoginDate 
FROM Student S
CROSS APPLY (SELECT TOP 1 * FROM StudentLoginInfo SLI WHERE S.StudentId = SLI.StudentId ORDER BY LoginDate DESC) SLI