N Baris Berturutan yang Memenuhi Syarat
Corak tetingkap klasik “tiga hari berturut-turut dengan jualan melebihi X”.
N Baris Berturutan yang Memenuhi Syarat ialah pelajaran Persediaan Temu Duga Pengaturcaraan percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga Pengaturcaraan, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.
Klasik LeetCode
Ini ialah salah satu masalah temu duga SQL yang paling kerap ditanya: "Cari semua tarikh yang mempunyai sekurang-kurangnya tiga hari berturutan dengan jualan melebihi suatu ambang," atau soalan kegemaran LeetCode, "laporkan stadium yang mempunyai 3+ baris berturutan dengan kehadiran melebihi 100."
Bentuknya sentiasa sama: sesuatu baris hanya layak jika baris itu berada dalam rentetan sebanyak N baris berturutan yang layak. Pelajaran ini menunjukkan dua penyelesaian yang kemas serta perangkap yang menjerat kebanyakan calon.
Data Contoh
Kita menggunakan jadual sales harian. Syaratnya ialah amount > 100. Kita mesti mengembalikan setiap hari yang termasuk dalam rentetan 3 hari kalendar berturutan atau lebih, yang semuanya memenuhi syarat.
sale_date— satu baris bagi setiap hariamount— jumlah jualan pada hari tersebut
Kehalusan penting: baris mestilah berturutan dari segi urutan, dan bagi versi berasaskan tarikh, mestilah berturutan dalam kalendar juga.
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 | 200Pendekatan 1: Tapis Kemudian Kelompok
Pendekatan yang teguh: mula-mula kekalkan hanya baris yang memenuhi syarat, kemudian kelompokkan baris yang tinggal kepada kelompok berturutan, dan akhirnya kekalkan kelompok yang panjangnya sekurang-kurangnya N.
Langkah pertama ialah penapisan WHERE. Langkah kedua menggunakan semula penambat jurang-dan-kelompok. Oleh sebab kita menapis terlebih dahulu, kelompok di sini bermaksud "rentetan hari berturutan yang memenuhi syarat."
WITH qualifying AS (
SELECT sale_date
FROM sales
WHERE amount > 100
)
SELECT * FROM qualifying ORDER BY sale_date;Menambat Rentetan yang Memenuhi Syarat
Nomborkan baris yang memenuhi syarat mengikut tarikh dan lakukan penolakan untuk mendapatkan penambat kelompok. Baris yang berturutan pada kalendar AND semuanya memenuhi syarat akan berkongsi penambat; sebarang hari yang tidak memenuhi syarat telah dibuang, lalu memutuskan rentetan tepat pada tempat yang sepatutnya.
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;Mengekalkan Kelompok yang Cukup Panjang
Kumpulkan mengikut penambat, kira baris, dan kekalkan hanya kumpulan dengan COUNT(*) >= 3. Jika penemuduga mahu tarikh individu yang memenuhi syarat dikembalikan, cantumkan penambat yang dikekalkan dengan baris bernombor.
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: Tetingkap COUNT Gelongsor
Pendekatan yang lebih menarik apabila N kecil dan tetap: gunakan bingkai tetingkap untuk mengira jumlah baris di sekeliling yang turut memenuhi syarat. Jika mana-mana tetingkap yang mengandungi N baris berturutan termasuk baris ini dan semuanya memenuhi syarat, baris tersebut termasuk dalam jawapan.
Mula-mula tambahkan penanda benar-palsu, kemudian jumlahkan penanda itu merentasi bingkai gelongsor.
SELECT sale_date, amount,
CASE WHEN amount > 100 THEN 1 ELSE 0 END AS ok
FROM sales;Menjumlahkan Merentasi Tiga Bingkai
Untuk rentetan tepat 3 baris, baris yang memenuhi syarat termasuk dalam jawapan jika tetingkap 3 baris yang berakhir di sini, berpusat di sini, atau bermula di sini mempunyai jumlah 3. Kira ketiga-tiga jumlah bergerak tersebut dan uji sama ada mana-mana satunya bersamaan dengan 3.
Inilah teknik di sebalik penyelesaian LeetCode 601 (Trafik Manusia di Stadium).
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);Perangkap Jurang Kalendar
Pendekatan jumlah tetingkap menggunakan ROWS, yang mengira baris hasil bersebelahan, bukannya hari kalendar yang bersebelahan. Jika hari yang tidak memenuhi syarat telah ditapis keluar, dua baris boleh bersebelahan dalam hasil tetapi tidak berturutan dalam kalendar.
Pengajaran: gunakan tetingkap gelongsor pada siri harian penuh (jangan tapis terlebih dahulu), atau gunakan kaedah penambat tarikh yang sememangnya menghormati jurang kalendar. Nyatakan pertukaran ini dalam temu duga.
Menggeneralisasikan kepada Sebarang N
Pendekatan 1 (tapis-kemudian-kelompok) mudah digeneralisasikan: cuma ubah HAVING COUNT(*) >= N. Itulah kelebihan besarnya berbanding jumlah berbilang tetingkap, yang memerlukan lebih banyak bingkai apabila N bertambah.
Untuk N yang diparameterkan atau besar, utamakan kaedah kelompok — ia hanya memerlukan satu perubahan ambang berbanding N−1 tetingkap yang perlu ditulis secara manual.
-- only the threshold changes for N = 5
HAVING COUNT(*) >= 5Memilih Pendekatan
Panduan keputusan ringkas untuk disebut dengan jelas:
- Tapis-kemudian-kelompok: menghormati jurang kalendar, boleh digeneralisasikan kepada sebarang N, dan mengembalikan rentetan penuh — pilihan lalai yang selamat.
- Jumlah tetingkap gelongsor: kemas untuk N kecil yang tetap pada siri harian yang padat, tetapi berhati-hati dengan perangkap ROWS berbanding kalendar.
Menyebut kedua-duanya, kemudian memberikan alasan bagi pilihan anda, ialah perkara yang sememangnya dihargai oleh penemuduga peringkat pertengahan hingga kanan.
Penyelesaian Lengkap
Jawapan mudah alih untuk sebarang N yang menghormati keberterusan kalendar dan mengembalikan tarikh 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;Semakan Pantas
Kenal pasti pepijat yang halus.
Ringkasan
Untuk N baris berturutan yang memenuhi suatu syarat:
- Tapis-kemudian-kelompok: kekalkan baris yang memenuhi syarat, gunakan penambat
date - ROW_NUMBER(), kelompokkan, dan gunakanHAVING COUNT(*) >= N. Kaedah ini boleh digeneralisasikan dan menghormati jurang kalendar. - Jumlah tetingkap gelongsor: tandakan baris, kemudian jumlahkan merentasi bingkai tetap sebanyak N baris; kemas tetapi berhati-hati dengan perbezaan ROWS dan kalendar pada data yang telah ditapis terlebih dahulu.
Seterusnya: mengira rentetan aktif semasa pengguna pada hari ini.
Pelajari Persediaan Temu Duga Pengaturcaraan dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 90
- Pelajaran
- 360
Soalan Lazim
Adakah pelajaran “N Baris Berturutan yang Memenuhi Syarat” percuma?
Ya — teks penuh “N Baris Berturutan yang Memenuhi Syarat” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga Pengaturcaraan, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “N Baris Berturutan yang Memenuhi Syarat”?
Corak tetingkap klasik “tiga hari berturut-turut dengan jualan melebihi X”. Anda berlatih Persediaan Temu Duga Pengaturcaraan menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga Pengaturcaraan?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga Pengaturcaraan di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “N Baris Berturutan yang Memenuhi Syarat” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga Pengaturcaraan ini?
Ya. Setiap pelajaran Persediaan Temu Duga Pengaturcaraan menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Mengesan Hari Kalendar Berturutan
- Rentetan Terpanjang bagi Setiap Pengguna
- N Baris Berturutan yang Memenuhi Syarat
- Rentetan Aktif Semasa Setakat Hari Ini