Así es como lo haría con una analítica:
SELECT id, val
FROM ( SELECT id, val
,LAG(val) OVER (ORDER BY id) AS prev_val
FROM p ) x
WHERE val <> COALESCE(prev_val, val)
ORDER BY id
Actualización (alguna explicación):
Las funciones analíticas funcionan como un paso de posprocesamiento. El resultado de la consulta se divide en agrupaciones (partition by
) y la función analítica se aplica dentro del contexto de una agrupación.
En este caso, la consulta es una selección de p
. La función analítica que se está aplicando es LAG
. Dado que no hay una partición partition by
cláusula, solo hay una agrupación:el conjunto de resultados completo. Esta agrupación está ordenada por id
. LAG
devuelve el valor de la fila anterior en la agrupación utilizando el orden especificado. El resultado es que cada fila tiene una columna adicional (con alias prev_val) que es el val
de la fila anterior. Esa es la subconsulta.
Luego buscamos filas donde el val
no coincide con el val
de la fila anterior (prev_val). El COALESCE
maneja el caso especial de la primera fila que no tiene un valor anterior.
Las funciones analíticas pueden parecer un poco extrañas al principio, pero una búsqueda en funciones analíticas encuentra muchos ejemplos que explican cómo funcionan. Por ejemplo:http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm Solo recuerda que es un paso de posprocesamiento. No podrá realizar filtrado, etc. en el valor de una función analítica a menos que la subconsulte.