Pernyataan tersebut menggunakan apa yang disebut 'by group processing'. Sebelum langkah dapat dijalankan, data harus diurutkan berdasarkan btn wtn resp_ji
.
first.resp_ji
piece sedang memeriksa untuk melihat apakah ini pertama kalinya nilai resp_ji saat ini terlihat dalam kombinasi btn/wtn saat ini. Demikian juga last.resp_ji
piece sedang memeriksa apakah ini terakhir kalinya ia akan melihat nilai resp_ji
saat ini dalam kombinasi btn/wtn saat ini.
Menggabungkan semuanya menjadi satu pernyataan:
if not (first.resp_ji and last.resp_ji);
Mengatakan, jika nilai resp_ji saat ini terjadi beberapa kali untuk kombinasi btn/wtn saat ini, maka simpan catatannya, jika tidak, buang catatannya. Perilaku if
pernyataan ketika digunakan seperti itu secara implisit menyimpan/membuang catatan.
Untuk melakukan hal yang setara dalam SQL, Anda dapat melakukan sesuatu seperti:
- Temukan semua catatan untuk dibuang.
- Buang catatan tersebut dari kumpulan data asli.
Jadi...
create table rows_to_discard as
select btn, wtn, resp_ji, count(*) as freq
from mytable
group by btn, wtn, resp_ji
having count(*) = 1
create table want as
select a.*
from mytable a
left join rows_to_discard b on b.btn = a.btn
and b.wtn = a.wtn
and b.resp_ji = a.resp_ji
where b.btn is null
EDIT :Saya harus menyebutkan bahwa tidak ada padanan SQL sederhana. Itu mungkin dengan memberi nomor baris dalam subquery, dan kemudian membangun logika di atas itu, tetapi itu akan sangat buruk. Ini mungkin juga bergantung pada rasa spesifik dari SQL yang digunakan.