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
首先,您应该在表中找到第一个 FAIL 时间。然后,您应该选择早于第一个 FAIL 的每个 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')
)
)
SQLFiddle demo