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

SQL Server Get one row for each student with highest date

我有两个表如下:

我想查找 StudentId、FirstName、StudentLoginInfoId、LoginDate。我希望每个登录日期更高的学生只有一个条目。

预期结果:

您可以使用 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 的行)将包含该学生的最高登录日期值。

您可以使用"CROSS APPLY"找到您想要的:

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