选择所有行,直到第一次出现给定值

时间:2009-04-09 12:23:23

标签: sql oracle

以下数据:

  

日期|值|检查
  2009 | 5 | 1
  2008 | 5 | 1
  2007 | 5 | 1
  2006 | 5 | 0
  2005年| 5 | 0
  2004年| 5 | 1
  2003年| 5 | 1
  2002 | 5 | 1

我需要从2009年开始选择所有行,直到检查列中第一次出现0:

  

日期|值|检查
  2009 | 5 | 1
  2008 | 5 | 1
  2007 | 5 | 1

我尝试使用滞后功能,但我只能在一个月前检查。

我正在研究Oracle 10g。

更新:

所有似乎都运行良好,我的测试数据集太小,无法说出性能差异。

3 个答案:

答案 0 :(得分:13)

SELECT * FROM mytable where date > (
   SELECT max(date) FROM mytable where check = 0    
) 

答案 1 :(得分:3)

SELECT  *
FROM    (
        SELECT  m.*,
                MIN(CASE WHEN check = 0 THEN 0 ELSE 1 END) OVER (ORDER BY date DESC)) AS mn
        FROM    mytable
        )
WHERE   mn = 1

甚至更好:

SELECT  *
FROM    (
        SELECT  m.*, ROW_NUMBER() OVER (ORDER BY mydate DESC) AS rn
        FROM    mytable m
        ORDER BY
                mydate DESC
        )
WHERE   rownum = DECODE(check, 0, NULL, rn)
ORDER BY
        mydate DESC

后一个查询实际上会在遇到第一个检查零时立即停止扫描。

答案 2 :(得分:1)

DECLARE @mytable TABLE (date integer, [value] integer, [check] integer)  

INSERT INTO @mytable VALUES (2009, 5, 1)  
INSERT INTO @mytable VALUES (2008, 5, 1)  
INSERT INTO @mytable VALUES (2007, 5, 1)  
INSERT INTO @mytable VALUES (2006, 5, 0)  
INSERT INTO @mytable VALUES (2005, 5, 0)  
INSERT INTO @mytable VALUES (2004, 5, 1)  
INSERT INTO @mytable VALUES (2003, 5, 1)  
INSERT INTO @mytable VALUES (2002, 5, 1)  

SELECT *  
FROM @mytable  
WHERE date > (SELECT MAX(date) FROM @mytable WHERE [Check] = 0)