PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL - valeur de colonne modifiée - sélectionnez l'optimisation de la requête

Voici comment je procéderais avec un analytique :

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

Mise à jour (quelques explications) :

Les fonctions analytiques fonctionnent comme une étape de post-traitement. Le résultat de la requête est divisé en groupes (partition by ) et la fonction analytique est appliquée dans le cadre d'un regroupement.

Dans ce cas, la requête est une sélection de p . La fonction analytique appliquée est LAG . Puisqu'il n'y a pas de partition by clause, il n'y a qu'un seul regroupement :l'ensemble du jeu de résultats. Ce regroupement est trié par id . LAG renvoie la valeur de la ligne précédente dans le regroupement en utilisant l'ordre spécifié. Le résultat est chaque ligne ayant une colonne supplémentaire (aliasée prev_val) qui est le val de la rangée précédente. C'est la sous-requête.

Ensuite, nous recherchons les lignes où le val ne correspond pas à la val de la ligne précédente (prev_val). Le COALESCE gère le cas particulier de la première ligne qui n'a pas de valeur précédente.

Les fonctions analytiques peuvent sembler un peu étranges au début, mais une recherche sur les fonctions analytiques trouve de nombreux exemples décrivant leur fonctionnement. Par exemple :http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm N'oubliez pas qu'il s'agit d'une étape de post-traitement. Vous ne pourrez pas effectuer de filtrage, etc. sur la valeur d'une fonction analytique à moins de la sous-interroger.