Dit is hoe ik het zou doen met een analyse:
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
Update (enige uitleg):
Analytische functies werken als een nabewerkingsstap. Het zoekresultaat is onderverdeeld in groepen (partition by
) en de analytische functie wordt toegepast binnen de context van een groepering.
In dit geval is de zoekopdracht een selectie uit p
. De analytische functie die wordt toegepast is LAG
. Aangezien er geen partition by
clausule, is er maar één groepering:de volledige resultaatset. Deze groepering is gerangschikt op id
. LAG
retourneert de waarde van de vorige rij in de groepering in de opgegeven volgorde. Het resultaat is dat elke rij een extra kolom heeft (alias prev_val), de val
van de vorige rij. Dat is de subquery.
Dan zoeken we naar rijen waar de val
komt niet overeen met de val
van de vorige rij (prev_val). De COALESCE
behandelt het speciale geval van de eerste rij die geen vorige waarde heeft.
Analytische functies lijken in het begin misschien een beetje vreemd, maar een zoekopdracht naar analytische functies vindt veel voorbeelden die doornemen hoe ze werken. Bijvoorbeeld:http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm Onthoud alleen dat het een nabewerkingsstap is. U kunt de waarde van een analytische functie niet filteren, enz., tenzij u er een subquery op uitvoert.