Takto bych to udělal s analytikem:
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
Aktualizace (nějaké vysvětlení):
Analytické funkce fungují jako krok následného zpracování. Výsledek dotazu je rozdělen do seskupení (partition by ) a analytická funkce je aplikována v kontextu seskupení.
V tomto případě je dotaz výběrem z p . Použitá analytická funkce je LAG . Protože neexistuje žádný partition by klauzule, existuje pouze jedno seskupení:celá sada výsledků. Toto seskupení je uspořádáno podle id . LAG vrátí hodnotu předchozího řádku v seskupení pomocí zadaného pořadí. Výsledkem je, že každý řádek má další sloupec (s aliasem prev_val), což je val předchozího řádku. To je poddotaz.
Pak hledáme řádky, kde je val neodpovídá val předchozího řádku (prev_val). COALESCE zpracovává speciální případ prvního řádku, který nemá předchozí hodnotu.
Analytické funkce se mohou na první pohled zdát trochu divné, ale při hledání analytických funkcí najdete mnoho příkladů, jak fungují. Například:http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm Nezapomeňte, že se jedná o krok následného zpracování. Nebudete moci provádět filtrování atd. hodnoty analytické funkce, pokud na ni nezadáte dílčí dotaz.