Så här skulle jag göra 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
Uppdatering (viss förklaring):
Analytiska funktioner fungerar som ett efterbearbetningssteg. Frågeresultatet är uppdelat i grupperingar (partition by
) och den analytiska funktionen tillämpas inom ramen för en gruppering.
I det här fallet är frågan ett urval från p
. Den analytiska funktionen som tillämpas är LAG
. Eftersom det inte finns någon partition by
sats, det finns bara en gruppering:hela resultatuppsättningen. Denna gruppering är sorterad efter id
. LAG
returnerar värdet på föregående rad i grupperingen med den angivna ordningen. Resultatet är att varje rad har en extra kolumn (alias prev_val) som är val
av föregående rad. Det är underfrågan.
Sedan letar vi efter rader där val
matchar inte val
av föregående rad (prev_val). COALESCE
hanterar specialfallet för den första raden som inte har ett tidigare värde.
Analytiska funktioner kan verka lite konstiga till en början, men en sökning på analytiska funktioner hittar många exempel som går igenom hur de fungerar. Till exempel:http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm Kom bara ihåg att det är ett efterbearbetningssteg. Du kommer inte att kunna utföra filtrering etc på värdet av en analytisk funktion om du inte undersöker den.