我们的数据存在一些错误,我们正试图从数据库中提取所有错误记录。见下面的例子:
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,....
如果有人提供示例查询会很棒。感谢您的帮助!!
答案 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;