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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/733979/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-18 18:02:40  来源:igfitidea点击:

Selecting all rows until first occurrence of given value

sqloracle

提问by Kamil Zadora

For following data:

对于以下数据:

date|value|check
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 | 5 | 1
2008 | 5 | 1
2007 | 5 | 1
2006 | 5 | 0
2005 | 5 | 0
2004 | 5 | 1
2003 | 5 | 1
2002 | 5 | 1

I need to select all rows from 2009 back until first occurrence of 0 in check column:

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

date|value|check
2009 | 5 | 1
2008 | 5 | 1
2007 | 5 | 1

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

I tried with the lag function, but I was only able to check a month back.

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

I am working on Oracle 10g.

我正在研究 Oracle 10g。

UPDATE:

更新:

All seems to work well, my test data set is too small to say anything about the performance differences.

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

回答by kenj0418

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

回答by Quassnoi

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

or even better:

甚至更好:

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

The latter query will actually stop scanning as soon as it encounters the first zero in check.

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

回答by Lieven Keersmaekers

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)