Beginilah cara saya melakukannya dengan analitik:
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
Pembaruan (beberapa penjelasan):
Fungsi analitik beroperasi sebagai langkah pasca-pemrosesan. Hasil kueri dipecah menjadi beberapa pengelompokan (partition by
) dan fungsi analitik diterapkan dalam konteks pengelompokan.
Dalam hal ini, kueri adalah pilihan dari p
. Fungsi analitik yang diterapkan adalah LAG
. Karena tidak ada partition by
klausa, hanya ada satu pengelompokan:seluruh hasil yang ditetapkan. Pengelompokan ini diurutkan berdasarkan id
. LAG
mengembalikan nilai baris sebelumnya dalam pengelompokan menggunakan urutan yang ditentukan. Hasilnya setiap baris memiliki kolom tambahan (alias prev_val) yang merupakan val
dari baris sebelumnya. Itu adalah subquery.
Kemudian kita cari baris dimana val
tidak cocok dengan val
dari baris sebelumnya (prev_val). COALESCE
menangani kasus khusus dari baris pertama yang tidak memiliki nilai sebelumnya.
Fungsi analitik mungkin tampak agak aneh pada awalnya, tetapi pencarian pada fungsi analitik menemukan banyak contoh berjalan melalui cara kerjanya. Misalnya:http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm Ingatlah bahwa ini adalah langkah pasca-pemrosesan. Anda tidak akan dapat melakukan pemfilteran, dll. pada nilai fungsi analitik kecuali jika Anda melakukan subkueri.