Sådan ville jeg gøre det med en analytisk:
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
Opdatering (noget forklaring):
Analytiske funktioner fungerer som et efterbehandlingstrin. Forespørgselsresultatet er opdelt i grupperinger (partition by
), og den analytiske funktion anvendes i sammenhæng med en gruppering.
I dette tilfælde er forespørgslen et udvalg fra p
. Den analytiske funktion, der anvendes, er LAG
. Da der ikke er nogen partition by
klausul, er der kun én gruppering:hele resultatsættet. Denne gruppering er sorteret efter id
. LAG
returnerer værdien af den forrige række i grupperingen ved hjælp af den angivne rækkefølge. Resultatet er, at hver række har en ekstra kolonne (aliased prev_val), som er val
af den foregående række. Det er underforespørgslen.
Derefter ser vi efter rækker, hvor val
matcher ikke val
af den forrige række (prev_val). COALESCE
håndterer specialtilfældet af den første række, som ikke har en tidligere værdi.
Analytiske funktioner kan virke lidt mærkelige i starten, men en søgning på analytiske funktioner finder en masse eksempler på, hvordan de fungerer. For eksempel:http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm Bare husk, at det er et efterbehandlingstrin. Du vil ikke være i stand til at udføre filtrering osv. på værdien af en analytisk funktion, medmindre du underforespørger den.