Ето как бих го направил с анализатор:
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
Актуализация (някакво обяснение):
Аналитичните функции работят като стъпка за последваща обработка. Резултатът от заявката се разделя на групи (partition by
) и аналитичната функция се прилага в контекста на групиране.
В този случай заявката е селекция от p
. Прилаганата аналитична функция е LAG
. Тъй като няма partition by
клауза, има само едно групиране:целия набор от резултати. Това групиране е подредено по id
. LAG
връща стойността на предишния ред в групирането, използвайки посочения ред. Резултатът е, че всеки ред има допълнителна колона (с псевдоним prev_val), която е val
от предходния ред. Това е подзаявката.
След това търсим редове, където val
не съответства на val
на предишния ред (prev_val). COALESCE
обработва специалния случай на първия ред, който няма предишна стойност.
Аналитичните функции може да изглеждат малко странни в началото, но търсенето на аналитичните функции намира много примери, разказващи как работят. Например:http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm Само не забравяйте, че това е стъпка за последваща обработка. Няма да можете да извършите филтриране и т.н. върху стойността на аналитична функция, освен ако не я направите подзаявка.