LAG dan LEAD untuk Baris Berdekatan
Akses nilai baris sebelumnya dan berikutnya tanpa SELF JOIN.
LAG dan LEAD untuk Baris Berdekatan adalah pelajaran SQL Interview Prep gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Interview Prep mencakup 4 pelajaran total.
Pertanyaan yang Diajukan Pewawancara
Salah satu pertanyaan wawancara analis yang paling umum adalah: "Bandingkan setiap baris dengan baris sebelumnya tanpa penggabungan dengan tabel itu sendiri." Contohnya adalah pendapatan dari bulan ke bulan, waktu masuk pengguna sebelumnya, atau peristiwa berikutnya dalam suatu rangkaian.
Jawaban yang tepat adalah fungsi jendela LAG dan LEAD. Keduanya memungkinkan suatu baris melihat nilai baris di dekatnya sambil mempertahankan setiap baris perincian. Dalam pelajaran ini, Anda akan membangun model mental yang tepat tentang cara keduanya menavigasi baris yang berdekatan.
Fungsi LAG dan LEAD
LAG(col) mengembalikan nilai col dari baris sebelumnya. LEAD(col) mengembalikan nilai dari baris berikutnya. "Sebelumnya" dan "berikutnya" sepenuhnya ditentukan oleh ORDER BY di dalam klausa OVER.
- LAG melihat ke belakang.
- LEAD melihat ke depan.
Keduanya merupakan fungsi jendela dengan pergeseran: fungsi ini tidak pernah menggabungkan baris, melainkan hanya menambahkan nilai baris di dekatnya ke baris saat ini.
Sintaks Dasar LAG
Berikut bentuk umumnya. Kita memiliki tabel sales dengan kolom month dan revenue. Kita ingin setiap baris juga menampilkan pendapatan bulan sebelumnya.
OVER (ORDER BY month) memberi tahu mesin cara menentukan "sebelumnya". Baris pertama tidak memiliki pendahulu, sehingga prev_revenue bernilai NULL pada baris tersebut.
SELECT
month,
revenue,
LAG(revenue) OVER (ORDER BY month) AS prev_revenue
FROM sales
ORDER BY month;Membaca Hasil
Untuk data 2024-01 = 100, 2024-02 = 130, 2024-03 = 120, kueri mengembalikan:
- Januari: pendapatan 100, prev_revenue NULL
- Februari: pendapatan 130, prev_revenue 100
- Maret: pendapatan 120, prev_revenue 130
Setiap baris mengambil nilai dari baris yang tepat berada di atasnya dalam kumpulan terurut. Tidak ada penggabungan dengan tabel itu sendiri, kueri bersarang, atau baris yang hilang.
LEAD Melihat ke Depan
LEAD adalah kebalikan dari LAG. Gunakan fungsi ini ketika suatu baris perlu mengetahui apa yang muncul berikutnya, misalnya tanggal pembelian berikutnya untuk menghitung jarak waktu antar pesanan.
Baris terakhir dalam kumpulan terurut tidak memiliki penerus, sehingga hasil LEAD-nya adalah NULL.
SELECT
month,
revenue,
LEAD(revenue) OVER (ORDER BY month) AS next_revenue
FROM sales
ORDER BY month;Argumen Pergeseran
Kedua fungsi menerima argumen kedua opsional: berapa banyak baris yang harus dilompati. LAG(col, 2) bergerak mundur dua baris, sedangkan LEAD(col, 3) melompat maju tiga baris.
Pewawancara menggunakan hal ini untuk menanyakan, misalnya, "pendapatan dua bulan lalu" atau "nilai tiga baris di bawah." Pergeseran bawaan adalah 1.
SELECT
month,
revenue,
LAG(revenue, 2) OVER (ORDER BY month) AS revenue_2_months_ago
FROM sales
ORDER BY month;Argumen Nilai Bawaan
Argumen ketiga memberikan nilai pengganti ketika tidak ada baris di dekatnya, sehingga hasilnya bukan NULL. Bentuknya adalah LAG(col, offset, default).
Ini berguna ketika perhitungan lanjutan tidak dapat menerima NULL, misalnya memperlakukan nilai sebelumnya yang hilang sebagai 0 agar selisih tetap dapat dihitung.
SELECT
month,
revenue,
LAG(revenue, 1, 0) OVER (ORDER BY month) AS prev_revenue
FROM sales
ORDER BY month;PARTITION BY Mengatur Ulang Jendela
Data nyata jarang memiliki satu rangkaian global. Biasanya Anda membandingkan data dalam setiap pelanggan, produk, atau wilayah. PARTITION BY memulai kembali perhitungan LAG/LEAD di awal setiap partisi.
Artinya, baris pertama setiap partisi mendapatkan NULL dari LAG, dan nilai tidak pernah bocor melewati batas ke data pelanggan lain.
SELECT
customer_id,
order_date,
amount,
LAG(amount) OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS prev_amount
FROM orders;Contoh Terpandu: Jarak Antar-Pesanan
Tugas yang sering muncul adalah mengukur jeda antara pesanan berurutan seorang pelanggan. Ambil tanggal pesanan sebelumnya dengan LAG, lalu kurangkan.
Pesanan pertama setiap pelanggan menghasilkan NULL karena tidak ada tanggal sebelumnya untuk dikurangkan. Inilah jenis perbandingan per pelanggan yang diharapkan pewawancara dapat diselesaikan dengan fungsi jendela.
SELECT
customer_id,
order_date,
order_date - LAG(order_date) OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS days_since_prev
FROM orders;Mengapa Bukan Penggabungan Mandiri
Jawaban sebelum adanya fungsi jendela adalah penggabungan mandiri berkorelasi: gabungkan tabel dengan dirinya sendiri berdasarkan "baris yang tanggalnya paling besar di bawah tanggal ini." Cara ini berhasil, tetapi bertele-tele, rentan terhadap kesalahan saat ada nilai yang sama, dan sering kali lebih lambat.
LAG/LEADmenyatakan maksud dalam satu baris.- Keduanya dievaluasi dalam satu lintasan berurutan.
- Nilai yang sama ditangani secara deterministik oleh
ORDER BYAnda.
Mengatakan "Saya akan menggunakan LAG alih-alih penggabungan mandiri" menunjukkan penguasaan.
Kesalahan Umum: ORDER BY Tidak Ada
Tanpa ORDER BY dalam klausa OVER, "baris sebelumnya" tidak terdefinisi. Beberapa mesin basis data menolaknya, sedangkan yang lain mengembalikan hasil yang tidak dapat diprediksi. Selalu tentukan urutan jendelanya.
Ingat juga bahwa pengurutan di dalam OVER tidak bergantung pada ORDER BY luar kueri. Jendela menentukan baris mana yang menjadi tetangga; klausa luar hanya menentukan urutan tampilan.
Pemeriksaan Singkat
Uji pemahaman Anda tentang fungsi jendela dengan pergeseran.
Ringkasan
Anda kini mengetahui fungsi jendela dengan pergeseran:
LAG(col)membaca baris sebelumnya, sedangkanLEAD(col)membaca baris berikutnya, sesuai denganORDER BYjendela.- Argumen opsional:
LAG(col, offset, default). PARTITION BYmengatur ulang navigasi untuk setiap grup, sehingga baris batas adalahNULL.- Keduanya menggantikan penggabungan mandiri yang rumit untuk membandingkan baris yang berdekatan.
Berikutnya, kita menerapkannya pada pertanyaan analis yang hampir pasti muncul: perubahan dari periode ke periode.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “LAG dan LEAD untuk Baris Berdekatan” gratis?
Ya — teks lengkap “LAG dan LEAD untuk Baris Berdekatan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Interview Prep, upgrade ke CoddyKit PRO. Kursus SQL Interview Prep mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “LAG dan LEAD untuk Baris Berdekatan”?
Akses nilai baris sebelumnya dan berikutnya tanpa SELF JOIN. Kamu berlatih SQL Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai SQL Interview Prep?
Tidak diperlukan pengalaman sebelumnya. SQL Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “LAG dan LEAD untuk Baris Berdekatan” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Interview Prep ini?
Ya. Setiap pelajaran SQL Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- LAG dan LEAD untuk Baris Berdekatan
- Perubahan Antar-Periode
- NTILE untuk Pengelompokan Rentang
- FIRST_VALUE, LAST_VALUE, dan Tepi Frame