LAG & LEAD di SQL

Mengambil nilai dari baris sebelumnya (LAG) atau sesudahnya (LEAD). Andalan untuk menghitung pertumbuhan bulan ke bulan.

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)
BagianKeterangan
jarakOpsional. Berapa baris ke belakang/depan. Bawaan 1.
defaultOpsional. 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

idtanggalkaryawan_idprodukkategoriqtyharga
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
query.sql
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;
>_ Jalankan & ubah query ini di browser

Hasil 3 baris

bulanomzetbulan_laluselisih
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

  1. CTE bulanan merangkum omzet per bulan: 2026-01 = 25.300.000, 2026-02 = 14.850.000, 2026-03 = 16.750.000.
  2. LAG(omzet) OVER (ORDER BY bulan): setiap bulan mengambil omzet bulan sebelumnya. Januari tidak punya bulan sebelumnya, jadi NULL.
  3. Februari mengambil omzet Januari (25.300.000). Selisihnya 14.850.000 - 25.300.000 = -10.450.000, artinya turun.
  4. 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 BY di dalam OVER. 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).
Progres bab Window Function 0/5 dipelajari
Lanjut: CREATE TABLE

Belajar SQL bareng mentor

Hafal sintaks itu mudah. Menjawab pertanyaan bisnis, itu skill.

Private Class Python & SQL untuk Data: dari query dasar sampai JOIN dan studi kasus kerja, dengan kurikulum dan jadwal yang menyesuaikan kamu.

Lihat Private Class