2009-04-09 12 views
9

Por siguientes datos:Selección de todas las filas hasta la primera aparición de valor dado

fecha | valor | comprobar
2009 | 5 | 1
2008 | 5 | 1
2007 | 5 | 1
2006 | 5 | 0
2005 | 5 | 0
2004 | 5 | 1
2003 | 5 | 1
2002 | 5 | 1

necesito para seleccionar todas las filas de 2009 hacia atrás hasta la primera ocurrencia de 0 en la columna de comprobación:

fecha | valor | comprobar
2009 | 5 | 1
2008 | 5 | 1
2007 | 5 | 1

Intenté con la función de retraso, pero solo pude verificar hace un mes.

Estoy trabajando en Oracle 10g.

gracias de antemano,

ACTUALIZACIÓN:

Todo parece funcionar bien, mi conjunto de datos de prueba es demasiado pequeña como para decir nada acerca de las diferencias de rendimiento. ¡Gracias por todas tus entradas!

Respuesta

12
SELECT * FROM mytable where date > (
    SELECT max(date) FROM mytable where check = 0  
) 
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 

o incluso mejor:

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 

Esta última consulta realidad dejará de buscar tan pronto como se encuentra con el primer cero en jaque.

+0

Esto sólo sería "detener la exploración" si el orden interno POR mostró satisfecho por un índice, en cuyo caso puede ser que también utilice la primera versión. De lo contrario, Oracle clasificará el conjunto de resultados interno en su totalidad. –

+0

Claro que sí. Pero esta solución solo necesita un índice el (fecha) para trabajar de manera eficiente, mientras que la solución MAX() también necesita un índice (verificación, fecha). – Quassnoi

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) 
+0

No estoy seguro de que 'DECLARE @mytable TABLE' funcione en Oracle :) – Quassnoi

+0

lol. viejos hábitos ... –

Cuestiones relacionadas