N Baris Berturut-turut yang Memenuhi Kondisi
Pola jendela klasik “tiga hari berturut-turut dengan penjualan di atas X”.
N Baris Berturut-turut yang Memenuhi Kondisi 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.
Soal Klasik LeetCode
Ini adalah salah satu soal wawancara SQL yang paling sering ditanyakan: "Temukan semua tanggal dengan setidaknya tiga hari berturut-turut ketika penjualan melampaui ambang batas," atau soal favorit LeetCode "laporkan stadion dengan 3+ baris berurutan yang jumlah kehadirannya di atas 100."
Bentuknya selalu sama: sebuah baris hanya memenuhi syarat jika berada di dalam rangkaian N baris berurutan yang memenuhi syarat. Pelajaran ini menunjukkan dua solusi yang rapi serta jebakan yang menjebak sebagian besar kandidat.
Data Contoh
Kita menggunakan tabel harian sales. Kondisinya adalah amount > 100. Kita harus mengembalikan setiap hari yang termasuk dalam rangkaian 3 hari atau lebih yang berurutan dalam kalender dan semuanya memenuhi kondisi tersebut.
sale_date— satu baris untuk setiap hariamount— total penjualan pada hari tersebut
Hal penting yang sering terlewat: baris harus berurutan dalam urutan, dan untuk versi berbasis tanggal, juga harus berurutan dalam kalender.
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 | 200Saran 1: Saring lalu Bentuk Pulau
Pendekatan yang andal: pertama, simpan hanya baris yang memenuhi syarat; kemudian kelompokkan baris yang tersisa menjadi pulau-pulau berurutan; terakhir, pertahankan pulau yang panjangnya setidaknya N.
Langkah pertama adalah penyaringan dengan WHERE. Langkah kedua menggunakan kembali jangkar metode celah-dan-pulau. Karena kita menyaring terlebih dahulu, sebuah pulau di sini berarti "rangkaian hari berurutan yang memenuhi syarat."
WITH qualifying AS (
SELECT sale_date
FROM sales
WHERE amount > 100
)
SELECT * FROM qualifying ORDER BY sale_date;Menentukan Jangkar Rangkaian yang Memenuhi Syarat
Beri nomor pada baris yang memenuhi syarat berdasarkan tanggal, lalu kurangkan untuk mendapatkan jangkar pulau. Baris yang berurutan dalam kalender AND semuanya memenuhi syarat akan memiliki jangkar yang sama; hari yang tidak memenuhi syarat telah dihapus, sehingga rangkaian terputus tepat di tempat yang semestinya.
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;Mempertahankan Pulau yang Cukup Panjang
Kelompokkan berdasarkan jangkar, hitung jumlah baris, lalu pertahankan hanya kelompok dengan COUNT(*) >= 3. Jika pewawancara menginginkan kembali tanggal individual yang memenuhi syarat, hubungkan jangkar yang dipertahankan dengan baris bernomor.
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;Pendekatan 2: Jendela COUNT Bergeser
Pendekatan yang lebih ringkas ketika N kecil dan tetap: gunakan bingkai jendela untuk menghitung berapa banyak baris di sekitarnya yang juga memenuhi syarat. Jika ada jendela berisi N baris berurutan yang mencakup baris ini dan semuanya memenuhi syarat, baris tersebut termasuk dalam hasil.
Pertama, tambahkan penanda logika, lalu jumlahkan penanda tersebut pada bingkai yang bergeser.
SELECT sale_date, amount,
CASE WHEN amount > 100 THEN 1 ELSE 0 END AS ok
FROM sales;Menjumlahkan Tiga Bingkai
Untuk rangkaian tepat 3, sebuah baris yang memenuhi syarat termasuk dalam hasil jika jendela 3 baris yang berakhir di sini, berpusat di sini, atau dimulai di sini memiliki jumlah 3. Hitung ketiga jumlah bergulir tersebut dan uji apakah salah satunya sama dengan 3.
Inilah teknik di balik solusi LeetCode 601 (Lalu Lintas Manusia di Stadion).
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);Jebakan Celah Kalender
Pendekatan jumlah pada jendela menggunakan ROWS, yang menghitung baris hasil yang bersebelahan, bukan hari kalender yang bersebelahan. Jika hari yang tidak memenuhi syarat sudah disaring, dua baris dapat bersebelahan dalam hasil tetapi tidak berurutan dalam kalender.
Pelajaran: terapkan jendela bergeser pada deret harian lengkap (jangan menyaring terlebih dahulu), atau gunakan metode jangkar tanggal yang secara otomatis menghormati celah kalender. Sampaikan kompromi ini dalam wawancara.
Menggeneralisasi ke N Apa Pun
Pendekatan 1 (saring lalu bentuk pulau) dapat digeneralisasi dengan mudah: cukup ubah HAVING COUNT(*) >= N. Inilah keunggulan utamanya dibandingkan penjumlahan beberapa jendela, yang memerlukan lebih banyak bingkai seiring bertambahnya N.
Untuk N yang berparameter atau besar, pilih metode pulau — cukup mengubah satu ambang batas, bukan menulis manual N−1 jendela.
-- only the threshold changes for N = 5
HAVING COUNT(*) >= 5Memilih Pendekatan
Panduan keputusan singkat yang dapat disampaikan:
- Saring lalu bentuk pulau: menghormati celah kalender, dapat digeneralisasi ke N apa pun, dan mengembalikan seluruh rangkaian — pilihan standar yang aman.
- Jumlah pada jendela bergeser: elegan untuk N kecil yang tetap pada deret harian yang padat, tetapi waspadai perbedaan ROWS dan kalender.
Menyebutkan keduanya, lalu menjelaskan alasan pilihan Anda, adalah hal yang sangat dihargai pewawancara tingkat menengah hingga senior.
Solusi Lengkap
Jawaban portabel untuk N apa pun yang menghormati keberurutan kalender dan mengembalikan tanggal yang memenuhi syarat:
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;Pemeriksaan Singkat
Temukan kesalahan yang tersamar.
Ringkasan
Untuk N baris berurutan yang memenuhi suatu kondisi:
- Saring lalu bentuk pulau: pertahankan baris yang memenuhi syarat, gunakan jangkar
date - ROW_NUMBER(), kelompokkan, lalu gunakanHAVING COUNT(*) >= N. Pendekatan ini dapat digeneralisasi dan menghormati celah kalender. - Jumlah pada jendela bergeser: beri penanda pada baris, lalu jumlahkan pada bingkai tetap berisi N baris; pendekatan ini elegan, tetapi waspadai perbedaan ROWS dan kalender pada data yang telah disaring.
Berikutnya: menghitung rentetan aktif saat ini milik pengguna hingga hari ini.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “N Baris Berturut-turut yang Memenuhi Kondisi” gratis?
Ya — teks lengkap “N Baris Berturut-turut yang Memenuhi Kondisi” 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 “N Baris Berturut-turut yang Memenuhi Kondisi”?
Pola jendela klasik “tiga hari berturut-turut dengan penjualan di atas X”. 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 “N Baris Berturut-turut yang Memenuhi Kondisi” 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
- Mendeteksi Hari Kalender yang Berurutan
- Rangkaian Terpanjang per Pengguna
- N Baris Berturut-turut yang Memenuhi Kondisi
- Rangkaian Aktif Saat Ini hingga Hari Ini