Подтвердить что ты не робот

Выбор всех строк до первого появления данного значения

Для следующих данных:

Дата | Значение | регистрация
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.

ОБНОВИТЬ:

Кажется, все работает хорошо, мой набор тестовых данных слишком мал, чтобы что-либо говорить о различиях в производительности.

4b9b3361

Ответ 1

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

Ответ 2

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

Последний запрос фактически прекратит сканирование, как только он обнаружит первый нуль.

Ответ 3

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)