是否可以从DB2(或任何其他sql)查询中选择性地获取行,如下所示?

时间:2015-11-20 09:01:12

标签: sql db2

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

1 个答案:

答案 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')

                              )
                     ) 

SQLFiddle demo