14 Stimmen

Auswahl aller Zeilen bis zum ersten Auftreten eines bestimmten Wertes

Für folgende Daten:

Datum|Wert|Prüfung
2009 | 5 | 1
2008 | 5 | 1
2007 | 5 | 1
2006 | 5 | 0
2005 | 5 | 0
2004 | 5 | 1
2003 | 5 | 1
2002 | 5 | 1

Ich muss alle Zeilen von 2009 zurück bis zum ersten Auftreten von 0 in der Prüfspalte auswählen:

Datum|Wert|Prüfung
2009 | 5 | 1
2008 | 5 | 1
2007 | 5 | 1

Ich habe es mit der Verzögerungsfunktion versucht, aber ich konnte nur einen Monat zurückblicken.

Ich arbeite mit Oracle 10g.

UPDATE :

Alles scheint gut zu funktionieren, mein Testdatensatz ist zu klein, um etwas über die Leistungsunterschiede zu sagen.

20voto

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

4voto

Quassnoi Punkte 396418
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

oder noch besser:

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

Die letztgenannte Abfrage bricht die Suche ab, sobald sie auf die erste Null in der Prüfung stößt.

1voto

Lieven Keersmaekers Punkte 55277
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)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X