TIME STATUS
9:00 Success
8:00 Success
7:00 Fail
6:00 Fail
5:00 Fail
4:00 Success
3:30 Fail
3:00 Success
... ...
该表包含大量记录。 TIME列实际上是一个时间戳,但为了简单起见,我刚刚提供了h:mm格式。
我的要求是获取STATUS列值介于两个'成功'之间的所有记录的第一组。当表中的数据按时间降序排序时的值,如图所示。
所以在上面的例子中,查询应该获取3,4,5条记录。即,
TIME STATUS
7:00 Fail
6:00 Fail
5:00 Fail
另一个例子:
TIME STATUS
9:00 Success
8:00 Success
7:00 Success
6:00 Fail
5:00 Fail
4:00 Fail
3:30 Fail
3:00 Success
2:30 Fail
2:15 Fail
2:12 Fail
2:00 Success
... ...
在上述情况下,查询应该获取4,5,6,7条记录,这是第一组“失败”位于两个'成功之间。即,
TIME STATUS
6:00 Fail
5:00 Fail
4:00 Fail
3:30 Fail
答案 0 :(得分:1)
首先你应该在表格中找到第一个失败时间。然后你应该比第一个更早地选择每个FAIL,并且表中当前和第一个FAIL都没有任何SUCCESS行。
以下是标准SQL中的查询:
SELECT * FROM T AS T1
WHERE STATUS='fail'
AND NOT EXISTS (SELECT * FROM T
WHERE STATUS='Success'
AND TIME>T1.TIME
AND TIME<=
(
SELECT TIME FROM T as T2
WHERE STATUS='fail'
AND NOT EXISTS (SELECT * FROM T
WHERE TIME>T2.TIME
AND STATUS='Fail')
)
)