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
我有两个表如下:
我想查找 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