es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Oracle SQL: Convertir una condición anidada de “if” en Excel en la fila actual y en las dos filas anteriores a SQL.

Tengo una fórmula de Excel con una condición IF anidada que compara el valor de la fila actual con el de la fila inmediatamente anterior y el de la fila anterior con el valor de la segunda fila anterior de la misma columna.

Fórmula:

=SI(B8<>B7,SI(B7<>B6,B6,B7),B8)

Se intentó la siguiente consulta pero se obtiene el error “ORA-00920: operador relacional inválido”:

select MYTABLE.*,
CASE WHEN MSYMBOL over (order by MDATE) <> lag(MSYMBOL,1) over (order by MDATE)
THEN CASE
WHEN lag(MSYMBOL,1) over (order by MDATE) <> lag(MSYMBOL,2) over (order by MDATE)
THEN lag(MSYMBOL,2) over (order by MDATE)
ELSE lag(MSYMBOL,1) over (order by MDATE)
END,
ELSE MSYMBOL over (order by MDATE)
END as FLAG
from MYTABLE

La creación de tabla, las instrucciones de inserción y la consulta se actualizan en este enlace DB<>FIDDLE.

Agradezco cualquier ayuda con esto. Gracias de antemano.

Gracias,
Richa

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para comparar filas anteriores en Oracle SQL

    Para comparar el valor de la fila actual con la fila inmediatamente anterior y la fila anterior con el valor de la segunda fila anterior desde la misma columna, se puede utilizar la siguiente consulta SQL:

    SELECT MT.*,
    CASE
    WHEN MSYMBOL != LAG(MSYMBOL, 1) OVER (ORDER BY MDATE)
    THEN CASE
    WHEN LAG(MSYMBOL, 1) OVER (ORDER BY MDATE) != LAG(MSYMBOL, 2) OVER (ORDER BY MDATE)
    THEN LAG(MSYMBOL, 2) OVER (ORDER BY MDATE)
    ELSE LAG(MSYMBOL, 1) OVER (ORDER BY MDATE)
    END
    ELSE MSYMBOL
    END AS FLAG
    FROM MYTABLE MT;

    En esta consulta, se utiliza la función LAG() para comparar el valor de la fila actual con la fila inmediatamente anterior y la fila anterior con el valor de la segunda fila anterior desde la misma columna. La cláusula “ORDER BY MDATE” se utiliza para ordenar las filas.

    La sentencia CASE se utiliza para aplicar la condición IF anidada, donde se compara el valor de la fila actual con la fila inmediatamente anterior y la fila anterior con el valor de la segunda fila anterior desde la misma columna.

    El resultado será una tabla con una columna adicional llamada “FLAG” que contiene los valores comparados para cada fila.

    Puede probar esta consulta SQL en la tabla de muestra proporcionada en el enlace de DBFiddle compartido anteriormente.

Comments are closed.