Gap and Island Analysis di SQL
Blog/Tutorial SQL/Gap and Island Analysis di SQL

Gap and Island Analysis di SQL

BimaBima
·15 Juli 2026·10 menit baca

Penulis

Bima

Bima

Founder & Data Professional

Bagikan

TL;DR

Gap and island analysis adalah teknik SQL buat ngelompokkin baris yang berurutan jadi grup (island) dan nemuin celah di antaranya (gap). Trik intinya bikin selisih antara nomor urut baris dan nilai datanya, karena selisih itu konstan buat baris yang berturut-turut. Kepake buat hitung streak login, deteksi tanggal transaksi hilang, atau cari periode aktif.

Gap and island analysis adalah teknik SQL buat ngelompokkin baris yang berurutan jadi grup (island) dan nemuin celah di antaranya (gap). Kuncinya satu trik selisih antara nilai data dan nomor urut baris.

Pertanyaan kayak "berapa hari pelanggan login berturut-turut?" atau "tanggal transaksi mana yang hilang?" itu susah dijawab pakai GROUP BY biasa. Gap and island yang nyelesaiin. Di bawah ini ada penjelasan triknya, query siap pakai, dan contoh streak login data Indonesia.

Apa itu gap and island analysis?

Gap and island analysis adalah cara ngelompokkin baris yang nilainya berurutan (island) sekaligus ngenalin bagian yang bolong (gap). Namanya dari gambaran deret data: bagian yang nyambung diibaratkan pulau, celah kosong diibaratkan laut di antaranya. Teknik ini masuk kategori window function dan sering muncul di soal wawancara data analyst.

Gimana trik dasarnya bekerja?

Intinya satu observasi sederhana. Buat baris yang berurutan, kalau kamu kurangi nilai datanya dengan nomor urut baris, hasilnya konstan.

Contoh, tanggal 1, 2, 3 Juli punya nomor urut 1, 2, 3. Selisihnya sama semua. Begitu ada lompatan ke tanggal 6, selisihnya berubah, dan grup baru dimulai. Selisih inilah yang kita pakai sebagai kunci GROUP BY.

login_date - ROW_NUMBER() OVER (ORDER BY login_date)

Gimana cara cari island (deret berturut-turut)?

Pakai CTE buat bikin kunci grup dulu, baru di-GROUP BY:

WITH bertanda AS (
  SELECT
    user_id,
    login_date,
    login_date - (ROW_NUMBER() OVER (
      PARTITION BY user_id ORDER BY login_date
    ))::int AS grup_kunci
  FROM user_logins
)
SELECT
  user_id,
  MIN(login_date) AS mulai,
  MAX(login_date) AS selesai,
  COUNT(*)        AS panjang_streak
FROM bertanda
GROUP BY user_id, grup_kunci
ORDER BY mulai;

PARTITION BY user_id bikin perhitungan jalan per pelanggan, jadi streak satu orang nggak nyampur sama yang lain.

Contoh kasus: streak login pelanggan toko_berkah

Data login harian pelanggan 101 di dataset toko_berkah:

login_date
2026-07-01
2026-07-02
2026-07-03
2026-07-06
2026-07-07
2026-07-10

Setelah query island dijalanin, hasilnya tiga streak:

MulaiSelesaiPanjang
2026-07-012026-07-033 hari
2026-07-062026-07-072 hari
2026-07-102026-07-101 hari

Streak terpanjang pelanggan ini 3 hari. Dari 6 hari login, ada 2 gap: tanggal 4-5 dan tanggal 8-9. Buat program loyalitas, angka streak kayak gini bisa jadi dasar kasih reward ke pelanggan yang aktif berturut-turut. Mau kelompokkin data per rentang waktu lebih dulu? Baca SQL date bucketing.

Gimana cara nemuin gap (data yang hilang)?

Buat nemu celah, bandingin tiap tanggal sama tanggal berikutnya pakai LEAD. Kalau selisihnya lebih dari 1 hari, di situ ada gap:

SELECT
  login_date + 1                         AS gap_mulai,
  LEAD(login_date) OVER (ORDER BY login_date) - 1 AS gap_selesai
FROM user_logins
WHERE LEAD(login_date) OVER (ORDER BY login_date) - login_date > 1;

Hasilnya nunjukin rentang tanggal yang bolong, misalnya 2026-07-04 sampai 2026-07-05.

Kesalahan umum saat gap and island

  • Lupa PARTITION BY - kalau datanya multi-pelanggan, streak antar orang bakal nyampur. Selalu partisi per entitas.
  • Salah casting tanggal - di PostgreSQL, selisih DATE ngasih integer, tapi ROW_NUMBER ngasih bigint. Samakan tipe biar aman.
  • Ada duplikat tanggal - login dobel di hari sama bikin trik ROW_NUMBER meleset. Pakai DISTINCT atau agregasi dulu.
  • Data belum urut - ORDER BY di window wajib bener, karena seluruh trik gantung ke urutan.

FAQ

Pertanyaan yang sering muncul soal gap and island ada di bagian bawah ini.

Penutup

Gap and island kelihatan rumit, padahal intinya satu trik: selisih nilai dikurangi nomor urut jadi kunci grup. Dari situ kamu bisa hitung streak, periode aktif, sampai deteksi data yang hilang.

Mau latihan window function SQL langsung di browser? Kulik latihan di NgulikSQL. Buat dalemin ROW_NUMBER dan teman-temannya, cek dokumentasi resmi PostgreSQL Window Functions, atau lanjut baca pandas read_csv kalau kamu mau olah data yang sama di Python.

Coba Langsung

Mau praktek langsung? Mulai latihan SQL gratis

Latihan interaktif, langsung di browser.

Buka NgulikSQL →
Bagikan:
Bima
Ditulis oleh

Bima

Founder & Data Professional

Founder Ngulik Data. Passionate about making data analysis accessible for everyone.

Artikel terkait

Composite Index di SQL: Cara Kerja dan Urutan Kolom
Tutorial SQL
8 Oktober 2026•8 menit baca

Composite Index di SQL: Cara Kerja dan Urutan Kolom

Composite index itu index atas beberapa kolom sekaligus. Urutan kolomnya nentuin query mana yang kebantu, lewat aturan leftmost prefix.

BimaBima
Menghitung Stickiness (DAU/MAU) di SQL
Tutorial SQL
5 Oktober 2026•10 menit baca

Menghitung Stickiness (DAU/MAU) di SQL

Stickiness ngukur seberapa sering user balik lagi. Ini cara hitung DAU, MAU, dan rasio stickiness pakai SQL, plus contoh aplikasi UMKM.

BimaBima
Menghitung DAU dan MAU dengan SQL
Tutorial SQL
3 Oktober 2026•9 menit baca

Menghitung DAU dan MAU dengan SQL

DAU dan MAU dua metrik wajib buat produk digital. Ini cara hitungnya pakai SQL, lengkap query DISTINCT, per bulan, sampai rasio stickiness.

BimaBima
Kembali ke Blog
Ngulik Data logoNgulik Data

Platform edukasi data lengkap untuk professionals Indonesia. Belajar SQL, Data Analysis, dan lebih banyak lagi dengan praktek langsung dan feedback real-time.

© 2026 Ngulik Data. Semua hak dilindungi.

TAUTAN
BantuanHargaDatasetBlogAfiliasi
LEGAL
Syarat & KetentuanKebijakan Privasi
Ngulik Data
DatasetLeaderboardBlogStore