Skip to Main Content

Español

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Duda con la función LAG

Marlon_FigueroaNov 21 2019 — edited Nov 22 2019

Hola muchacho buen día.

Haciendo unos selects me tope con un requerimiento que me ha quebrado la cabeza y es el siguiente:

Tengo una columna COL1 que tiene valores numéricos, estos valores pueden ser iguales y de repente cambiar como se ve en la tabla de ejemplo. La cosa es que cada vez que cambie el valor de la columna COL1 debo cambiar el valor de otra columna auxiliar y mantener el valor hasta que vuelva a cambiar, pero este valor solo debe ser 0 ó 1 y en su defecto 'S' o 'N'. Lo que he logrado es detectar cuando la columna cambia pero no puedo retener el valor y cambiarlo hasta un nuevo cambio. He usado la función analítica LAG y LEAD pero no lo logro. Llevo un buen rato.

Esta es la tabla con la columna COL1 que tiene los valores persistentes, la columna CAMBIOS donde detecto los cambios y la columna TEST_COL que es a donde quiero llegar.

COL1      CAMBIOS    TEST_COL

----------    ------------- ---------------

         2           N               0    

         3           Y               1

         3           N               1

         3           N               1

         4           Y               0

         4           N               0

         9           Y               1

Este es el query con el que he estado intentando pero no logro nada

      WITH sample_data AS(

   SELECT 2 col1, 3 col2 FROM dual UNION ALL

   SELECT 3 col1, 6 col2 FROM dual UNION ALL

   SELECT 3 col1, 7 col2 FROM dual UNION ALL

   SELECT 3 col1, 7 col2 FROM dual UNION ALL

   SELECT 4 col1, 7 col2 FROM dual UNION ALL

   SELECT 4 col1, 7 col2 FROM dual UNION ALL

   SELECT 9 col1, 9 col2 FROM dual

   )

   -- end of sample_data mimicking real table

   select col1, cambios, '' test_col from(

   select col1, decode(col1, LAG(col1,1, col1) OVER (ORDER BY col1),'N','Y') cambios        

   FROM sample_data);

Saludos muchachos y muchas gracias.

Comments
Post Details
Added on Nov 21 2019
0 comments
350 views