これは私が分析でそれを行う方法です:
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
がないため 句では、グループ化は1つだけです。つまり、結果セット全体です。このグループ化は、id
の順に並べられています。 。 LAG
指定された順序を使用して、グループ化の前の行の値を返します。その結果、各行にはval
である追加の列(別名prev_val)があります。 前の行の。それがサブクエリです。
次に、val
が含まれる行を探します val
と一致しません 前の行(prev_val)の。 COALESCE
前の値がない最初の行の特殊なケースを処理します。
分析関数は最初は少し奇妙に思えるかもしれませんが、分析関数を検索すると、それらがどのように機能するかを説明する多くの例が見つかります。例: http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm これは後処理ステップであることを忘れないでください。サブクエリを実行しない限り、分析関数の値に対してフィルタリングなどを実行することはできません。