0Pricing
Coding Interview Prep · Ders

Koşulu Sağlayan N Ardışık Satır

“Üç ardışık gün boyunca satışların X'in üzerinde olması” şeklindeki klasik pencere örüntüsü.

Koşulu Sağlayan N Ardışık Satır, CoddyKit'te ücretsiz bir Coding 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, Coding Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Coding Interview Prep kursu toplamda 4 dersten oluşur.

Klasik Bir LeetCode Sorusu

Bu, SQL mülakatlarında en sık sorulan sorulardan biridir: "Satışların bir eşiği aştığı en az üç ardışık gün içeren tüm tarihleri bulun," ya da LeetCode'un sevilen sorusundaki gibi "100'ün üzerinde katılımın olduğu 3 veya daha fazla ardışık satıra sahip stadyumu raporlayın."

Yapı her zaman aynıdır: Bir satır, yalnızca N adet ardışık koşulu sağlayan satırdan oluşan bir serinin içindeyse uygundur. Bu derste iki temiz çözüm ve adayların çoğunu yakalayan tuzak gösterilir.

Örnek Veriler

Günlük bir sales tablosu kullanıyoruz. Koşul amount > 100. Koşulu sağlayan 3 veya daha fazla ardışık takvim gününden oluşan bir seriye ait her günü döndürmeliyiz.

  • sale_date — gün başına bir satır
  • amount — o günün toplam satışı

Önemli incelik: Satırlar sıra bakımından ve tarih tabanlı sürümlerde takvim bakımından da ardışık olmalıdır.

SELECT * FROM sales ORDER BY sale_date;
-- sale_date  | amount
-- 2024-03-01 |  120
-- 2024-03-02 |  150
-- 2024-03-03 |  130
-- 2024-03-04 |   90
-- 2024-03-05 |  200

1. Yaklaşım: Önce Filtrele, Sonra Ada Oluştur

Sağlam yaklaşım şudur: Önce yalnızca koşulu sağlayan satırları tutun, ardından kalan satırları ardışık adalar hâlinde gruplayın ve son olarak uzunluğu en az N olan adaları tutun.

İlk adım WHERE filtresidir. İkinci adım, boşluklar ve adalar çapasını yeniden kullanır. Önce filtreleme yaptığımız için burada bir ada, "ardışık koşulu sağlayan günler serisi" anlamına gelir.

WITH qualifying AS (
  SELECT sale_date
  FROM sales
  WHERE amount > 100
)
SELECT * FROM qualifying ORDER BY sale_date;

Koşulu Sağlayan Serileri Çapalamak

Koşulu sağlayan satırları tarihe göre numaralandırıp ada çapasını elde etmek için çıkarma işlemi yapın. Takvimde ardışık olan ve AND koşulu sağlayan satırlar aynı çapa sahip olur; koşulu sağlamayan gün kaldırıldığı için seri tam olması gereken yerde bölünür.

WITH qualifying AS (
  SELECT sale_date
  FROM sales
  WHERE amount > 100
),
numbered AS (
  SELECT sale_date,
    ROW_NUMBER() OVER (ORDER BY sale_date) AS rn
  FROM qualifying
)
SELECT sale_date, sale_date - rn AS grp
FROM numbered;

Yeterince Uzun Adaları Tutma

Çapaya göre gruplayın, satırları sayın ve yalnızca COUNT(*) >= 3 koşulunu sağlayan grupları tutun. Görüşmeci tek tek koşulu sağlayan tarihleri geri almak isterse, tutulan çapaları numaralandırılmış satırlarla birleştirin.

WITH qualifying AS (
  SELECT sale_date FROM sales WHERE amount > 100
),
numbered AS (
  SELECT sale_date,
    ROW_NUMBER() OVER (ORDER BY sale_date) AS rn
  FROM qualifying
),
islands AS (
  SELECT sale_date - rn AS grp, COUNT(*) AS len
  FROM numbered
  GROUP BY sale_date - rn
  HAVING COUNT(*) >= 3
)
SELECT n.sale_date
FROM numbered n
JOIN islands i ON n.sale_date - n.rn = i.grp
ORDER BY n.sale_date;

2. Yaklaşım: Kayan COUNT Penceresi

N küçük ve sabit olduğunda daha zarif bir yaklaşım, çevredeki satırlardan kaçının da koşulu sağladığını saymak için bir pencere çerçevesi kullanmaktır. Bu satırı içeren N ardışık satırlık herhangi bir pencere tamamen koşulu sağlıyorsa, satır sonuçta yer alır.

Önce bir mantıksal işaret ekleyin, ardından kayan çerçeveler üzerinde bu işareti toplayın.

SELECT sale_date, amount,
  CASE WHEN amount > 100 THEN 1 ELSE 0 END AS ok
FROM sales;

Üç Çerçeve Üzerinde Toplama

Tam olarak 3 satırlık bir seri için, koşulu sağlayan bir satır; burada sona eren, burada merkezlenen veya burada başlayan 3 satırlık pencerenin toplamı 3 ise sonuçta yer alır. Üç kayan toplamı hesaplayın ve herhangi birinin 3'e eşit olup olmadığını sınayın.

LeetCode 601 (Stadyum İnsan Trafiği) çözümünün temelindeki teknik budur.

WITH flagged AS (
  SELECT sale_date, amount,
    CASE WHEN amount > 100 THEN 1 ELSE 0 END AS ok
  FROM sales
),
w AS (
  SELECT *,
    SUM(ok) OVER (ORDER BY sale_date
      ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS s_end,
    SUM(ok) OVER (ORDER BY sale_date
      ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS s_mid,
    SUM(ok) OVER (ORDER BY sale_date
      ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) AS s_start
  FROM flagged
)
SELECT sale_date, amount
FROM w
WHERE ok = 1 AND (s_end = 3 OR s_mid = 3 OR s_start = 3);

Takvim Boşluğu Tuzağı

Pencere toplamı yaklaşımı, bitişik sonuç satırlarını değil, bitişik takvim günlerini sayan ROWS kullanır. Koşulu sağlamayan bir gün önceden filtrelenmişse, iki satır sonuçta bitişik görünebilir ancak takvimde ardışık olmayabilir.

Ders: kayan pencereyi tam günlük diziye uygulayın (önceden filtrelemeyin) veya takvim boşluklarını kendiliğinden dikkate alan tarih çapası yöntemini kullanın. Bu ödünleşimi mülakatta belirtin.

Herhangi Bir N İçin Genelleme

1. yaklaşım (önce filtrele, sonra ada oluştur) kolayca genellenir: Yalnızca HAVING COUNT(*) >= N ifadesini değiştirmeniz yeterlidir. Bu, N büyüdükçe daha fazla çerçeve gerektiren çoklu pencere toplamına göre en büyük avantajıdır.

Parametreli veya büyük bir N için ada yöntemini tercih edin — N−1 adet elle yazılmış pencere yerine yalnızca eşik değerini değiştirmeniz gerekir.

-- only the threshold changes for N = 5
HAVING COUNT(*) >= 5

Yaklaşım Seçimi

Sesli olarak aktarabileceğiniz hızlı karar rehberi:

  • Önce filtrele, sonra ada oluştur: takvim boşluklarını dikkate alır, her N için genellenir ve serilerin tamamını döndürür — güvenli varsayılan seçenektir.
  • Kayan pencere toplamı: yoğun bir günlük dizide sabit ve küçük bir N için zariftir; ancak ROWS ile takvim arasındaki tuzağa dikkat edin.

Her iki yaklaşımın adını söyleyip seçiminizi gerekçelendirmek, orta ve kıdemli düzey görüşmecilerin tam olarak ödüllendirdiği beceridir.

Tam Çözüm

Takvimdeki ardışıklığa uyan ve koşulu sağlayan tarihleri döndüren, her N için geçerli taşınabilir çözüm:

WITH qualifying AS (
  SELECT sale_date FROM sales WHERE amount > 100
),
numbered AS (
  SELECT sale_date,
    ROW_NUMBER() OVER (ORDER BY sale_date) AS rn
  FROM qualifying
),
islands AS (
  SELECT sale_date - rn AS grp, COUNT(*) AS len
  FROM numbered
  GROUP BY sale_date - rn
  HAVING COUNT(*) >= 3
)
SELECT n.sale_date
FROM numbered n
JOIN islands i ON n.sale_date - n.rn = i.grp
ORDER BY n.sale_date;

Hızlı Kontrol

İnce hatayı bulun.

Özet

Bir koşulu sağlayan N ardışık satır için:

  • Önce filtrele, sonra ada oluştur: koşulu sağlayan satırları tutun, date - ROW_NUMBER() ile çapalayın, gruplayın ve HAVING COUNT(*) >= N kullanın. Genellenebilir ve takvim boşluklarını dikkate alır.
  • Kayan pencere toplamı: satırları işaretleyin ve sabit N satırlık çerçeveler üzerinde toplayın; zariftir ancak önceden filtrelenmiş verilerde ROWS ile takvim arasındaki farka dikkat edin.

Sıradaki konu: bir kullanıcının bugün itibarıyla devam eden etkinlik serisini hesaplamak.

Sıkça Sorulan Sorular

“Koşulu Sağlayan N Ardışık Satır” dersi ücretsiz mi?

Evet — “Koşulu Sağlayan N Ardışık Satır” 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 Coding Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Coding Interview Prep kursu toplamda 4 dersten oluşur.

“Koşulu Sağlayan N Ardışık Satır” dersinde ne öğreneceğim?

“Üç ardışık gün boyunca satışların X'in üzerinde olması” şeklindeki klasik pencere örüntüsü. Coding 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.

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

Önceden deneyim gerekmez. CoddyKit'te Coding 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.

“Koşulu Sağlayan N Ardışık Satır” 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 Coding Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Coding 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. Ardışık Takvim Günlerini Tespit Etme
  2. Kullanıcı Başına En Uzun Seri
  3. Koşulu Sağlayan N Ardışık Satır
  4. Bugün İtibarıyla Devam Eden Seri
← Coding Interview Prep Sayfasına Dön