sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL - valor de columna cambiado - seleccione optimización de consulta

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.