0Pricing
SQL Interview Prep · Ders

Bir Dizideki Boşlukları Bulma

Eksik değerleri ve her boşluğun başlangıç ile bitişini tespit edin.

Bir Dizideki Boşlukları Bulma, CoddyKit'te ücretsiz bir SQL Interview Prep dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, SQL Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Interview Prep kursu toplamda 4 dersten oluşur.

Şimdi Boşlukları Bulun

Şimdiye kadar satırları adalar halinde gruplandırdık. Bunun ayna görüntüsü olan mülakat sorusu şudur: hangi değerler eksik? Görüşmeciler bunu “Bu ID dizisindeki boşlukları bulun”, “hangi fatura numaraları atlandı” veya “hangi günlerde etkinlik yoktu” şeklinde sorar.

Boşluklar, adalar arasındaki boş alanlardır. Temel çıkarım şudur: genellikle eksik her değeri tek tek listelemeniz gerekmez; her boşluk aralığının başlangıç ve bitişini raporlamanız yeterlidir. Bu çok daha özdür ve görüşmecilerin beklediği de budur.

Örnek Boşluk Veri Kümesi

seq(n) tablosundaki mevcut 1, 2, 3, 7, 8, 10 değerlerini yeniden kullanın. Raporlanması gereken boşluklar şunlardır:

  • 4 ile 6 arası (ilk adadan sonra, 7'den önce)
  • 9 ile 9 arası (8 ile 10 arasında)

Bir boşluğu bir aralık olarak tanımladığımıza dikkat edin: boşluk başlangıcı = son mevcut değer + 1, boşluk bitişi = sonraki mevcut değer - 1. Aşağıdaki temel tekniğin amacı bu öz biçimdir.

CREATE TABLE seq (n INT);
INSERT INTO seq VALUES (1),(2),(3),(7),(8),(10);

Boşluklar İçin LEAD Yaklaşımı

Boşlukları algılamanın en temiz yolu, her satırı sonraki satırla LEAD kullanarak karşılaştırmaktır. Sonraki değer mevcut değerden 1'den fazla büyükse aralarında bir boşluk vardır.

Bu tür her satır için boşluk n + 1 değerinde başlar ve next_n - 1 değerinde biter. Önce ham LEAD çıktısına bakın:

SELECT
  n,
  LEAD(n) OVER (ORDER BY n) AS next_n
FROM seq
ORDER BY n;

Boşluk Aralıklarını Raporlama

LEAD sonucunu bir CTE içine alın ve sonraki değere sıçramanın 1'i aştığı satırları tutun. Bu satırlar boşlukları gösterir:

Bu işlem tam olarak 4-6 ve 9-9 boşluklarını döndürür. next_n - n - 1 ifadesi ayrıca her boşluktaki eksik değerlerin sayısını da verir; bu, sık karşılaşılan bir ek sorudur.

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;

Simetrik LAG Yöntemi

Aynı boşlukları bunun yerine LAG ile geriye bakarak da algılayabilirsiniz. Önceki değer mevcut değerden 1'den fazla küçükse mevcut satırdan önce bir boşluk vardır.

Bu yöntem tamamen eşdeğerdir; soru için hangisi daha doğal okunuyorsa onu seçin. Bazı görüşmeciler LEAD'i tercih eder; çünkü boşluk, kendisinden önce gelen satıra göre tanımlanır ve bu, insanların konuşma biçimine daha uygundur.

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;

Eksik Her Değeri Listeleme

Bazen görüşmeci gerçekten yalnızca aralıkları değil, eksik sayıların tam listesini ister. Sağlam yaklaşım, beklenen dizinin tamamını üretmek ve bunu mevcut değerlerle karşı birleştirmektir. Postgres'te generate_series tam aralığı oluşturur:

seq içinde bulunmayan, beklenen aralıktaki her tamsayı eksik bir değerdir. Amaçlanan en küçük ve en büyük değerleri biliyorsanız bu yöntem aralığın uçlarındaki boşlukları da ele alır.

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;

Diyalektler Arası Seri Üretimi

Her motor generate_series desteğine sahip değildir. Alternatifleri bilin:

  • Postgres: generate_series(1, 100).
  • SQL Server: özyinelemeli bir CTE veya bir sayı/tally tablosu.
  • MySQL 8: en büyük değere kadar sayan özyinelemeli bir CTE.

Özyinelemeli CTE, taşınabilir bir yedek yöntemdir. Karşı birleştirme yapabileceğiniz aynı beklenen diziyi üretir.

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;

Takvim Tarihlerindeki Boşluklar

Eksik tarihler için günlük adımla tam bir takvim üretin ve mevcut tarihlerle karşı birleştirme yapın. Bu, “hangi günlerde sipariş yoktu” sorusunun standart sorgusudur:

Bunu aralık tekniğiyle birleştirerek gerçek tarihler üzerinde LEAD uygulayın; böylece tek tek günler yerine eksik tarih aralıklarını raporlayın ve sınırlar için + INTERVAL '1 day' kullanın.

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;

Verilerin Dışındaki Uç Boşluklar

İnce bir tuzak şudur: LEAD/LAG yalnızca mevcut değerlerin arasındaki boşlukları bulur. En küçük mevcut değerden önce veya en büyük mevcut değerden sonra bir sayı eksikse, komşu bir satır bulunmadığından pencere yaklaşımı bunu göremez.

Görüşmeci beklenen tam aralığı tanımlıyorsa (örneğin 1 ile 100 arasındaki ID'ler) ve verileriniz 5'ten başlıyorsa, verilerin kendi en küçük ve en büyük değerlerini değil, belirtilen aralıkla sınırlandırılmış generate_series karşı birleştirmesini kullanmalısınız. Beklenen sınırların sabit olup olmadığını her zaman netleştirin.

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;

Grup Bazında Boşluk Algılama

Kullanıcı başına boşluklarda, iki farklı kullanıcının akışları arasında boşluk bildirilmemesi için LEAD/LAG işlemlerini grup sütununa göre bölümlendirin:

Her kullanıcının eksik aralıkları bağımsız olarak hesaplanır. Adalarda olduğu gibi, bölümlendirme yapmayı unutmak kullanıcıları sessizce birleştirir ve ilgisiz satırlar arasında uzanan hayali boşluklar üretir.

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;

Doğru Boşluk Yöntemini Seçme

Mülakat için karar rehberi:

  • Öz aralıklar ve yalnızca iç boşluklar istiyorsanız, adımın 1'i aştığı satırları filtreleyerek LEAD/LAG kullanın.
  • Her bir eksik değeri veya verilerin uçlarının dışındaki boşlukları istiyorsanız, belirtilen tam aralığa karşı generate_series karşı birleştirmesi kullanın.

Her iki seçeneği ve hangi durumda uygulanacağını belirtmeniz, konuyu derinlemesine bildiğinizi gösterir. LEAD yöntemi daha düşük maliyetlidir; seri yöntemi ise daha kapsamlıdır.

Hızlı Kontrol

Uç durumdaki tuzağı netleştirin.

Özet: Boşlukları Bulma

Boşluk algılama konusunu artık tamamen öğrendiniz:

  • Boşlukları aralıklar olarak raporlayın: boşluk başlangıcı = değer + 1, boşluk bitişi = sonraki değer - 1.
  • Adımın 1'i aştığı satırları filtreleyerek LEAD (veya simetrik LAG) iç boşlukları düşük maliyetle bulur.
  • generate_series karşı birleştirmesi her eksik değeri listeler ve belirtilen bir aralığa göre uç boşlukları da yakalar.
  • generate_series bulunmadığında özyinelemeli CTE'ler seriyi üretir.
  • Kullanıcı başına boşluklar için grup sütununa göre bölümlendirin.
  • Beklenen sınırları her zaman netleştirin.

Son olarak en kapsamlı çeşidi ele alacağız: tarih ve durum değişiklikleriyle tanımlanan adalar.

Sıkça Sorulan Sorular

“Bir Dizideki Boşlukları Bulma” dersi ücretsiz mi?

Evet — “Bir Dizideki Boşlukları Bulma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve SQL Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Interview Prep kursu toplamda 4 dersten oluşur.

“Bir Dizideki Boşlukları Bulma” dersinde ne öğreneceğim?

Eksik değerleri ve her boşluğun başlangıç ile bitişini tespit edin. SQL Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

SQL Interview Prep öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te SQL Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Bir Dizideki Boşlukları Bulma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu SQL Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her SQL Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Boşluklar ve Adalar Problemini Tanıma
  2. Satır Numarası Farkı Hilesi
  3. Bir Dizideki Boşlukları Bulma
  4. Tarih ve Durum Değişiklikleriyle Adalar
← SQL Interview Prep Sayfasına Dön