SQL Query用于检索状态已更改的记录

时间:2017-08-02 17:42:43

标签: sql-server

我们的数据存在一些错误,我们正试图从数据库中提取所有错误记录。见下面的例子:

select * from students where studentID = 555 order by TimeStamp desc

StudentID   StatusID    Status                     TimeStamp
555          2         Registered for Subject A    2017-08-01 01:00:00
555          3         Passed Subject A            2017-07-30 01:00:00
555          2         Registered for Subject A    2017-05-10 01:00:00
555          1         New Student                 2017-05-01 01:00:00

对于一个学生StudentID = 555,他已经通过了主题A(参见第2行),这应该是最终状态,但是有人手动并且再次将状态更新回“2” - > “为主题A注册”(这是不正确的)。有很多这样的学生受到了影响。我们想运行一个查询并将状态变为“3”的所有记录提取到任何其他状态,如2,1,.... 如果有人提供示例查询会很棒。感谢您的帮助!!

1 个答案:

答案 0 :(得分:0)

如果您想要学生,您可以使用条件聚合:

select studentid
from t
group by studentid
having max(case when statusid = 3 then timestamp end) < max(timestamp);

如果您想要“3”之后的详细记录,请使用窗口函数:

select t.*
from (select t.*, max(case when statusid = 3 then timestamp end) as timestamp_3
      from t
     ) t
where timestamp > timestamp_3;