Penjelasan sederhana
LAG mengambil nilai dari baris sebelumnya, dan LEAD mengambil nilai dari baris sesudahnya. Dengan begitu kamu bisa membandingkan setiap baris dengan baris di dekatnya.
Penggunaan paling umum adalah membandingkan bulan ini dengan bulan lalu: naik berapa, turun berapa, atau berapa persen pertumbuhannya.
Sintaks
LAG(kolom, [jarak], [default]) OVER (ORDER BY kolom_urut)
LEAD(kolom, [jarak], [default]) OVER (ORDER BY kolom_urut)
| Bagian | Keterangan |
|---|---|
jarak | Opsional. Berapa baris ke belakang/depan. Bawaan 1. |
default | Opsional. Nilai jika barisnya tidak ada. Bawaan NULL. |
Tanda [kurung siku] berarti bagian opsional. Kata kunci SQL tidak membedakan huruf besar-kecil, tapi menulisnya dengan huruf besar membuat query lebih mudah dibaca.
Contoh LAG & LEAD
Data contoh: penjualan
Tabel penjualan
| id | tanggal | karyawan_id | produk | kategori | qty | harga |
|---|---|---|---|---|---|---|
| 1 | 2026-01-05 | 4 | Laptop | Elektronik | 2 | 8500000 |
| 2 | 2026-01-12 | 6 | Printer | Elektronik | 1 | 2300000 |
| 3 | 2026-01-20 | 4 | Kursi Kantor | Furnitur | 5 | 1200000 |
| 4 | 2026-02-03 | 6 | Laptop | Elektronik | 1 | 8500000 |
| 5 | 2026-02-14 | 4 | Meja Kerja | Furnitur | 3 | 1750000 |
| 6 | 2026-02-25 | 5 | Kertas A4 | ATK | 20 | 55000 |
| 7 | 2026-03-02 | 6 | Kursi Kantor | Furnitur | 4 | 1200000 |
| 8 | 2026-03-10 | 4 | Printer | Elektronik | 2 | 2300000 |
| 9 | 2026-03-18 | 5 | Kertas A4 | ATK | 30 | 55000 |
| 10 | 2026-03-27 | 6 | Monitor | Elektronik | 3 | 1900000 |
WITH bulanan AS (
SELECT SUBSTRING(tanggal, 1, 7) AS bulan,
SUM(qty * harga) AS omzet
FROM penjualan
GROUP BY SUBSTRING(tanggal, 1, 7)
)
SELECT bulan, omzet,
LAG(omzet) OVER (ORDER BY bulan) AS bulan_lalu,
omzet - LAG(omzet) OVER (ORDER BY bulan) AS selisih
FROM bulanan;
Hasil 3 baris
| bulan | omzet | bulan_lalu | selisih |
|---|---|---|---|
| 2026-01 | 25300000 | NULL | NULL |
| 2026-02 | 14850000 | 25300000 | -10450000 |
| 2026-03 | 16750000 | 14850000 | 1900000 |
Omzet tiap bulan dibandingkan dengan bulan sebelumnya. Januari tidak punya pembanding sehingga NULL.
Cara kerjanya, langkah demi langkah
- CTE
bulananmerangkum omzet per bulan: 2026-01 = 25.300.000, 2026-02 = 14.850.000, 2026-03 = 16.750.000. LAG(omzet) OVER (ORDER BY bulan): setiap bulan mengambil omzet bulan sebelumnya. Januari tidak punya bulan sebelumnya, jadi NULL.- Februari mengambil omzet Januari (25.300.000). Selisihnya 14.850.000 - 25.300.000 = -10.450.000, artinya turun.
- Maret mengambil omzet Februari, selisihnya 1.900.000, artinya naik.
Dipakai untuk apa di kantor?
- Pertumbuhan omzet bulan ke bulan (month over month).
- Menghitung jeda hari antara dua pembelian pelanggan.
- Mendeteksi perubahan status pesanan.
Kesalahan yang sering terjadi
- Lupa
ORDER BYdi dalamOVER. Database tidak tahu mana baris "sebelumnya". - Kaget dengan NULL di baris pertama. Itu wajar; beri nilai pengganti dengan argumen ketiga, misalnya
LAG(omzet, 1, 0).
CREATE TABLE