Oto jak zrobiłbym to z analitykiem:
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
Aktualizacja (niektóre wyjaśnienie):
Funkcje analityczne działają jako etap przetwarzania końcowego. Wynik zapytania jest podzielony na grupy (partition by
), a funkcja analityczna jest stosowana w kontekście grupowania.
W tym przypadku zapytanie jest wyborem z p
. Stosowana funkcja analityczna to LAG
. Ponieważ nie ma partition by
klauzula, istnieje tylko jedno grupowanie:cały zestaw wyników. To grupowanie jest uporządkowane według id
. LAG
zwraca wartość poprzedniego wiersza w grupowaniu w określonej kolejności. Wynikiem jest, że każdy wiersz ma dodatkową kolumnę (alias prev_val), która jest val
poprzedniego rzędu. To jest podzapytanie.
Następnie szukamy wierszy, w których val
nie pasuje do val
poprzedniego wiersza (prev_val). COALESCE
obsługuje szczególny przypadek pierwszego wiersza, który nie ma poprzedniej wartości.
Funkcje analityczne mogą początkowo wydawać się nieco dziwne, ale wyszukiwanie funkcji analitycznych pozwala znaleźć wiele przykładów pokazujących, jak działają. Na przykład:http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm Pamiętaj tylko, że jest to etap przetwarzania końcowego. Nie będziesz w stanie wykonać filtrowania itp. na wartości funkcji analitycznej, chyba że wykonasz podzapytanie.