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.