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 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.
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ıramount— 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 | 2001. 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(*) >= 5Yaklaşı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 veHAVING COUNT(*) >= Nkullanı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 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.
“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ü. 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.
“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 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
- Ardışık Takvim Günlerini Tespit Etme
- Kullanıcı Başına En Uzun Seri
- Koşulu Sağlayan N Ardışık Satır
- Bugün İtibarıyla Devam Eden Seri