Sql server 查找带有日期时间的最后数据(状态)

Sql server 查找带有日期时间的最后数据(状态),sql-server,tsql,Sql Server,Tsql,我陷入了这样一种情况:我有一个 studentId Marks marksgotOn 1 10 2019-12-01 1 10 2019-12-01 2 35 2019-12-02 3 35 2019-12-02 4 90 2019-12-03 我要找出学生上一次拿到马克的时间 但我需要找到学生何时更改其lastResultStatus时间。您可以使用从上一行获取值并与当前行进行比较。

我陷入了这样一种情况:我有一个

studentId Marks marksgotOn
1         10    2019-12-01
1         10    2019-12-01
2         35    2019-12-02
3         35    2019-12-02
4         90    2019-12-03
我要找出学生上一次拿到马克的时间

但我需要找到学生何时更改其lastResultStatus时间。

您可以使用从上一行获取值并与当前行进行比较。我们使用分区将结果按学生分组,并按marksGotOn排序


基于@gotqn的答案,为了获得学生身份更改的最新日期:

WITH DataSource AS
(
    SELECT StudentId
         ,CASE WHEN Marks BETWEEN 0 AND 10 THEN 'Fail'WHEN Marks BETWEEN 30 AND 35 THEN 'Pass' WHEN Marks >=90 THEN 'Excellent' ELSE '' END AS ResultStatus
         ,marksGotOn 
    FROM Student
)
,
GradeChanges as
(
SELECT *
      ,IIF(LAG(ResultStatus) OVER(PARTITION BY StudentId ORDER BY marksGotOn) <> ResultStatus, 'Changed', 'Not Changed') as GradeChange
FROM DataSource
ORDER BY StudentId
        ,marksGotOn
)

select
    StudentId,
    max(marksgotOn) as LastGradeChange
where
    GradeChange = 'Changed'
group by
    StudentId

您的预期输出是什么?我预计学生上次状态更改时您可以将markgoton列添加到您的查询请共享数据中的预期输出我在您的查询中没有看到lastResultStatus列?或者这就是你想要建立的?
WITH DataSource AS
(
    SELECT StudentId
         ,CASE WHEN Marks BETWEEN 0 AND 10 THEN 'Fail'WHEN Marks BETWEEN 30 AND 35 THEN 'Pass' WHEN Marks >=90 THEN 'Excellent' ELSE '' END AS ResultStatus
         ,marksGotOn 
    FROM Student
)
SELECT *
      ,IIF(LAG(ResultStatus) OVER(PARTITION BY StudentId ORDER BY marksGotOn) <> ResultStatus, 'Changed', 'Not Changed')
FROM DataSource
ORDER BY StudentId
        ,marksGotOn
WITH DataSource AS
(
    SELECT StudentId
         ,CASE WHEN Marks BETWEEN 0 AND 10 THEN 'Fail'WHEN Marks BETWEEN 30 AND 35 THEN 'Pass' WHEN Marks >=90 THEN 'Excellent' ELSE '' END AS ResultStatus
         ,marksGotOn 
    FROM Student
)
,
GradeChanges as
(
SELECT *
      ,IIF(LAG(ResultStatus) OVER(PARTITION BY StudentId ORDER BY marksGotOn) <> ResultStatus, 'Changed', 'Not Changed') as GradeChange
FROM DataSource
ORDER BY StudentId
        ,marksGotOn
)

select
    StudentId,
    max(marksgotOn) as LastGradeChange
where
    GradeChange = 'Changed'
group by
    StudentId