So würde ich es mit einer Analyse machen:
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
Aktualisierung (einige Erklärungen):
Analytische Funktionen arbeiten als Nachbearbeitungsschritt. Das Abfrageergebnis wird in Gruppierungen aufgeteilt (partition by
) und die analytische Funktion wird im Kontext einer Gruppierung angewendet.
In diesem Fall ist die Abfrage eine Auswahl aus p
. Die angewendete Analysefunktion ist LAG
. Da es keine partition by
gibt -Klausel gibt es nur eine Gruppierung:die gesamte Ergebnismenge. Diese Gruppierung ist nach id
geordnet . LAG
gibt den Wert der vorherigen Zeile in der Gruppierung in der angegebenen Reihenfolge zurück. Das Ergebnis ist, dass jede Zeile eine zusätzliche Spalte (alias prev_val) hat, die der val
ist der vorhergehenden Reihe. Das ist die Unterabfrage.
Dann suchen wir nach Zeilen, in denen der val
stimmt nicht mit val
überein der vorherigen Zeile (prev_val). Die COALESCE
behandelt den Sonderfall der ersten Zeile, die keinen vorherigen Wert hat.
Analytische Funktionen mögen auf den ersten Blick etwas seltsam erscheinen, aber eine Suche nach analytischen Funktionen findet viele Beispiele, die erklären, wie sie funktionieren. Beispiel:http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm Denken Sie nur daran, dass es sich um einen Nachbearbeitungsschritt handelt. Sie können den Wert einer Analysefunktion nicht filtern usw., es sei denn, Sie führen eine Unterabfrage durch.