Kriteria ROWS & RANGE
Termasuk bagian Dasar-Dasar dalam perjalanan SQL di Coddy. Pelajaran 69 dari 72.
Saat ini, kita belum bisa menentukan secara fleksibel berapa banyak baris sebelum atau sesudah yang perlu diperhitungkan. Sekarang hal itu bisa dilakukan dengan kriteria ROWS & RANGE. Untuk menggunakannya, kita menulis:
OVER (ROWS BETWEEN --START-- AND --END--)
OVER (RANGE BETWEEN --START-- AND --END--)
Dan kita bisa menentukan opsi berikut:
CURRENT ROW: baris saat inin PRECEDING: baris sebelum baris saat inin FOLLOWING: baris setelah baris saat ini
Perbedaan antara ROWS & RANGE adalah kriteria ROWS tidak memedulikan nilainya, hanya posisinya, sedangkan RANGE mendefinisikan jendela berdasarkan rentang nilai, bukan posisi baris.
Untuk RANGE, kita harus menentukan ORDER BY --column_name-- karena jika tidak, sistem tidak akan tahu cara memilih jendela.
Contoh:
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWINGDi sini, kueri membuat jendela yang mencakup baris saat ini, baris sebelumnya, dan baris sesudahnya.
ORDER BY levels
RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWINGDi sini, dibuat sebuah jendela yang menyertakan level saat ini, satu level sebelumnya, dan satu level sesudahnya untuk setiap level (diurutkan secara menaik). Jika level saat ini adalah 5, jendela itu akan menyertakan level 4, 5, dan 6.
Catatan: Penggunaan RANGE BETWEEN mungkin mengakibatkan lebih banyak baris disertakan dalam jendela, karena penggunaan ini menyertakan semua baris yang memiliki nilai sama dengan nilai dalam rentang, sedangkan ROWS BETWEEN akan selalu menyertakan jumlah baris yang sama (selama tersedia dalam kumpulan data).
Selain itu, pada tanggal yang disimpan sebagai teks (seperti '2024-01-05'), offset RANGE tidak melakukan perhitungan tanggal: dengan 1 PRECEDING, jendela hanya mencakup baris dengan tanggal yang sama. Untuk menghitung hari, urutkan berdasarkan angka, misalnya julianday(date).
Berikut contoh sederhana untuk menjelaskan perbedaan ROWS dan RANGE:
Menggunakan ROWS:
SELECT employee_name, salary,
AVG(salary) OVER (
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
) as avg_salary_rowsMenggunakan RANGE:
SELECT employee_name, salary,
AVG(salary) OVER (
ORDER BY salary
RANGE BETWEEN 1000 PRECEDING AND 1000 FOLLOWING
) as avg_salary_rangeTantangan
MudahTabel dan kolom yang tersedia:
newspapers:date,num_newspapers
Untuk tantangan ini, kita memiliki data surat kabar yang diproduksi. Kita ingin mengetahui rata-rata surat kabar yang dicetak dua hari sebelum baris saat ini dan satu hari setelahnya. Kita juga ingin mengetahui selisih antara jumlah surat kabar terbanyak dan tersedikit yang dicetak sejak tanggal saat ini hingga tiga hari sebelumnya. Beri nama kolom-kolom ini avg_newspapers dan diff_newspapers, secara berurutan.
Coba sendiri
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Dasar-Dasar
4Kata Kunci Lainnya
Kata kunci INKata kunci BETWEENKata kunci LIKEKata kunci ASRangkuman: Model Ponsel2Kondisi
Dasar KondisiKata Kunci ANDKata Kunci ORKata Kunci NOTMenggabungkan Beberapa KondisiTanda KurungNilai Boolean3Format Pengembalian Khusus
Nilai nullUrutkan Hasil Bagian 1Urutkan Hasil Bagian 2Ulasan: Perusahaan Keamanan SiberBatasi Jumlah RecordUlasan: Pabrik Kendaraan6Tantangan Pengantar
Ulasan: Pemilihan ParlemenUlasan: Polisi Menangkap Pelaku KejahatanUlasan: Wadah Minuman BarUlasan: Insinyur Membuat Kolom Baru9Beberapa Tabel
Join Dasar Bagian 1Join Dasar Bagian 2Ringkasan: JoinSelf joinRingkasan: Self joinUnionSederhanakan query dengan kata kunci WITHRingkasan: Query WITHRingkasan: Kontraktor Properti12Fungsi Window bagian 2
Fungsi RANK & DENSE_RANKRingkasan, RANK & DENSE_RANKFungsi NTILEFungsi AgregasiKriteria ROWS & RANGELatihan sendiri: Playground SQL