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.