Menemukan Celah dalam Deret
Deteksi nilai yang hilang serta awal dan akhir setiap celah.
Menemukan Celah dalam Deret adalah pelajaran SQL Interview Prep gratis di CoddyKit. Ini adalah pelajaran 3 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.
Sekarang Cari Celah
Sejauh ini kita telah mengelompokkan baris menjadi pulau. Pertanyaan wawancara yang merupakan kebalikannya adalah: nilai mana yang hilang? Pewawancara dapat merumuskannya sebagai "temukan celah dalam urutan ID ini", "nomor faktur mana yang terlewati", atau "pada hari apa tidak ada aktivitas".
Celah adalah ruang kosong di antara pulau. Inti pemahamannya adalah bahwa biasanya Anda tidak perlu mencantumkan setiap nilai yang hilang; Anda perlu melaporkan awal dan akhir setiap rentang celah, yang jauh lebih ringkas dan merupakan hal yang diharapkan pewawancara.
Contoh Kumpulan Data Celah
Gunakan kembali nilai yang ada, yaitu 1, 2, 3, 7, 8, 10, dari tabel seq(n). Celah yang harus dilaporkan adalah:
- Dari 4 hingga 6 (setelah pulau pertama, sebelum 7)
- Dari 9 hingga 9 (di antara 8 dan 10)
Perhatikan bahwa kita menjelaskan celah sebagai sebuah rentang: awal_celah = nilai terakhir yang ada + 1, akhir_celah = nilai berikutnya - 1. Bentuk ringkas itulah tujuan teknik inti di bawah ini.
CREATE TABLE seq (n INT);
INSERT INTO seq VALUES (1),(2),(3),(7),(8),(10);Pendekatan LEAD untuk Menemukan Celah
Detektor celah yang paling bersih membandingkan setiap baris dengan baris berikutnya menggunakan LEAD. Jika nilai berikutnya lebih besar 1 daripada nilai saat ini, berarti terdapat celah di antara keduanya.
Untuk setiap baris tersebut, celah dimulai pada n + 1 dan berakhir pada next_n - 1. Lihat hasil LEAD mentah terlebih dahulu:
SELECT
n,
LEAD(n) OVER (ORDER BY n) AS next_n
FROM seq
ORDER BY n;Melaporkan Rentang Celah
Bungkus hasil LEAD dalam CTE dan pertahankan hanya baris yang lompatan ke nilai berikutnya lebih besar dari 1. Baris-baris tersebut menandai celah:
Hasilnya tepat berupa celah 4-6 dan celah 9-9. Ekspresi next_n - n - 1 juga memberikan jumlah nilai yang hilang dalam setiap celah, yang merupakan pertanyaan lanjutan yang sering diajukan.
WITH stepped AS (
SELECT n, LEAD(n) OVER (ORDER BY n) AS next_n
FROM seq
)
SELECT
n + 1 AS gap_start,
next_n - 1 AS gap_end,
next_n - n - 1 AS missing_count
FROM stepped
WHERE next_n - n > 1
ORDER BY gap_start;Varian LAG Simetris
Anda dapat mendeteksi celah yang sama dengan melihat ke belakang menggunakan LAG. Celah ada sebelum baris saat ini jika nilai sebelumnya lebih kecil darinya lebih dari 1.
Hasilnya sepenuhnya setara; pilihlah cara yang terdengar lebih alami untuk pertanyaannya. Beberapa pewawancara lebih menyukai LEAD karena celah dijelaskan relatif terhadap baris yang mendahuluinya, sesuai dengan cara orang berbicara.
WITH stepped AS (
SELECT n, LAG(n) OVER (ORDER BY n) AS prev_n
FROM seq
)
SELECT prev_n + 1 AS gap_start,
n - 1 AS gap_end
FROM stepped
WHERE n - prev_n > 1
ORDER BY gap_start;Mencantumkan Setiap Nilai yang Hilang
Terkadang pewawancara benar-benar menginginkan daftar lengkap angka yang hilang, bukan hanya rentangnya. Pendekatan yang andal adalah membuat urutan lengkap yang diharapkan, lalu melakukan anti-gabung dengan data yang ada. Di Postgres, generate_series membuat rentang lengkap:
Setiap bilangan bulat dalam rentang yang diharapkan tetapi tidak ada dalam seq merupakan nilai yang hilang. Cara ini juga menangani celah di kedua ujung jika Anda mengetahui nilai minimum dan maksimum yang diharapkan.
SELECT g.n AS missing_value
FROM generate_series(
(SELECT MIN(n) FROM seq),
(SELECT MAX(n) FROM seq)
) AS g(n)
LEFT JOIN seq s ON s.n = g.n
WHERE s.n IS NULL
ORDER BY g.n;Pembuatan Deret Lintas Dialek
Tidak semua mesin memiliki generate_series. Ketahui alternatifnya:
- Postgres:
generate_series(1, 100). - SQL Server: CTE rekursif atau tabel angka/tally.
- MySQL 8: CTE rekursif yang menghitung hingga nilai maksimum.
CTE rekursif adalah pilihan pengganti yang lintas platform. CTE tersebut menghasilkan urutan yang sama untuk dilakukan anti-gabung.
WITH RECURSIVE nums AS (
SELECT (SELECT MIN(n) FROM seq) AS n
UNION ALL
SELECT n + 1 FROM nums
WHERE n + 1 <= (SELECT MAX(n) FROM seq)
)
SELECT nums.n AS missing_value
FROM nums
LEFT JOIN seq s ON s.n = nums.n
WHERE s.n IS NULL;Celah pada Tanggal Kalender
Untuk tanggal yang hilang, buat kalender lengkap dengan langkah harian dan lakukan anti-gabung. Ini adalah kueri standar untuk menjawab "pada hari apa tidak ada pesanan":
Gabungkan cara ini dengan teknik rentang dengan menerapkan LEAD pada tanggal yang ada untuk melaporkan rentang tanggal yang hilang, bukan setiap hari secara terpisah, menggunakan + INTERVAL '1 day' untuk batas-batasnya.
SELECT d::date AS missing_day
FROM generate_series(
DATE '2026-01-01', DATE '2026-01-31',
INTERVAL '1 day') AS d
LEFT JOIN daily_logins l ON l.login_date = d::date
WHERE l.login_date IS NULL
ORDER BY missing_day;Celah di Ujung di Luar Data
Perangkap yang halus: LEAD/LAG hanya menemukan celah di antara nilai yang ada. Jika sebuah angka hilang sebelum nilai minimum atau setelah nilai maksimum yang ada, pendekatan jendela tidak dapat melihatnya karena tidak ada baris tetangga.
Jika pewawancara menetapkan rentang lengkap yang diharapkan (misalnya ID 1 hingga 100) dan data Anda dimulai dari 5, Anda harus menggunakan anti-gabung generate-series yang dibatasi oleh rentang yang telah ditetapkan, bukan oleh nilai minimum dan maksimum data itu sendiri. Selalu klarifikasi apakah batas yang diharapkan bersifat tetap.
SELECT g.n AS missing_value
FROM generate_series(1, 100) AS g(n)
LEFT JOIN seq s ON s.n = g.n
WHERE s.n IS NULL;Deteksi Celah per Grup
Untuk celah per pengguna, lakukan partisi LEAD/LAG berdasarkan kolom grup agar celah tidak pernah dilaporkan di antara aliran dua pengguna yang berbeda:
Rentang nilai yang hilang untuk setiap pengguna dihitung secara terpisah. Seperti pada pulau, lupa melakukan partisi secara diam-diam menggabungkan pengguna dan menghasilkan celah semu yang membentang di antara baris-baris yang tidak berkaitan.
WITH stepped AS (
SELECT user_id, n,
LEAD(n) OVER (PARTITION BY user_id ORDER BY n) AS next_n
FROM seq_per_user
)
SELECT user_id, n + 1 AS gap_start, next_n - 1 AS gap_end
FROM stepped
WHERE next_n - n > 1
ORDER BY user_id, gap_start;Memilih Metode Celah yang Tepat
Panduan pengambilan keputusan untuk wawancara:
- Menginginkan rentang yang ringkas dan hanya celah internal? Gunakan
LEAD/LAG, lalu filter saat langkahnya lebih besar dari 1. - Menginginkan setiap nilai yang hilang atau celah di luar ujung data? Gunakan anti-gabung generate-series terhadap rentang lengkap yang telah ditetapkan.
Menyebutkan kedua pilihan beserta kapan masing-masing berlaku menunjukkan pemahaman yang mendalam. Metode LEAD lebih hemat, sedangkan metode deret lebih lengkap.
Pemeriksaan Singkat
Tentukan perangkap pada kasus tepi.
Ringkasan: Menemukan Celah
Deteksi celah kini dikuasai:
- Laporkan celah sebagai rentang: awal_celah = nilai + 1, akhir_celah = nilai_berikutnya - 1.
LEAD(atauLAGyang simetris) yang difilter saat langkahnya lebih besar dari 1 akan menemukan celah internal dengan biaya rendah.- Anti-gabung generate-series mencantumkan setiap nilai yang hilang dan menangkap celah di ujung berdasarkan rentang yang telah ditetapkan.
- CTE rekursif membuat deret jika
generate_seriestidak tersedia. - Lakukan partisi berdasarkan kolom grup untuk menemukan celah per pengguna.
- Selalu klarifikasi batas yang diharapkan.
Terakhir, kita membahas varian yang paling lengkap: pulau yang ditentukan oleh perubahan tanggal dan status.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menemukan Celah dalam Deret” gratis?
Ya — teks lengkap “Menemukan Celah dalam Deret” 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 “Menemukan Celah dalam Deret”?
Deteksi nilai yang hilang serta awal dan akhir setiap celah. 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 3 dari 4.
Berapa lama pelajaran “Menemukan Celah dalam Deret” 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
- Mengenali Masalah Gaps-and-Islands
- Trik Selisih Nomor Baris
- Menemukan Celah dalam Deret
- Islands dengan Perubahan Tanggal dan Status