Membuat Deret Angka dan Tanggal
Gunakan rekursi untuk menghasilkan deret dalam pengisian celah dan kalender.
Membuat Deret Angka dan Tanggal 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.
Rekursi Tanpa Hierarki
CTE rekursif tidak hanya digunakan untuk pohon. Kegunaan utama lainnya adalah menghasilkan deret: rangkaian angka atau setiap tanggal dalam suatu rentang. Pewawancara menanyakan hal ini ketika suatu masalah memerlukan pengisian celah — menghasilkan baris yang tidak ada di tabel mana pun.
Pertanyaan klasiknya: "Tampilkan penjualan per hari untuk satu bulan, termasuk hari tanpa penjualan." Anda tidak dapat menampilkan hari yang hilang jika Anda belum terlebih dahulu menghasilkan semua harinya.
Deret Angka Sederhana
Bagian anchor menetapkan angka pertama; anggota rekursif menambahkan satu pada setiap iterasi; WHERE dalam anggota rekursif menghentikannya. Ini menghasilkan angka 1 hingga 10.
WITH RECURSIVE nums AS (
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM nums WHERE n < 10
)
SELECT n FROM nums;Predikat Penghentian
Berbeda dari bagan organisasi, deret angka tidak memiliki daun alami sebagai titik penghentian — Anda dapat terus menambah angka tanpa batas. Jadi, Anda harus menambahkan kondisi penghentian secara eksplisit dalam anggota rekursif: WHERE n < 10.
Ketika n mencapai 10, WHERE pada iterasi berikutnya menyaring satu-satunya baris kandidat, anggota rekursif tidak mengembalikan apa pun, dan rekursi berhenti. Lupa menambahkan pengaman ini adalah penyebab utama rekursi tak terkendali dalam wawancara.
Membuat Rentang Berparameter
Buat deret yang fleksibel dengan menentukan batas dari suatu nilai atau variabel. Di sini, kami menghasilkan angka 1 hingga N, dengan N sebagai nilai yang diberikan. Bentuk yang sama dapat menghasilkan deret berbasis 0 atau deret bertahap — cukup ubah nilai awal dan kenaikannya.
WITH RECURSIVE nums AS (
SELECT 1 AS n
UNION ALL
SELECT n + 2 FROM nums WHERE n + 2 <= 99
)
SELECT n FROM nums; -- odd numbers 1,3,5,...,99Menghasilkan Deret Tanggal
Ganti operasi bilangan bulat dengan operasi tanggal, dan Anda mendapatkan kalender. Nilai awalnya adalah tanggal mulai; anggota rekursif menambahkan satu hari sampai melewati tanggal akhir.
Sintaks untuk menambahkan satu hari berbeda-beda menurut dialek — bentuk bergaya Postgres ini menggunakan interval.
WITH RECURSIVE cal AS (
SELECT DATE '2024-01-01' AS d
UNION ALL
SELECT d + INTERVAL '1 day'
FROM cal
WHERE d < DATE '2024-01-31'
)
SELECT d FROM cal;Mengisi Celah dengan LEFT JOIN
Sekarang gabungkan kalender dengan data nyata. Hasilkan setiap hari, lalu gunakan LEFT JOIN pada tabel penjualan agar hari yang tidak ada tetap muncul dengan nilai NULL, yang Anda ubah menjadi 0 menggunakan COALESCE.
Pola dua langkah ini — hasilkan kerangkanya, lalu gunakan left join pada data faktanya — adalah inti dari setiap jawaban tentang pengisian celah.
WITH RECURSIVE cal AS (
SELECT DATE '2024-01-01' AS d
UNION ALL
SELECT d + INTERVAL '1 day' FROM cal
WHERE d < DATE '2024-01-07'
)
SELECT cal.d, COALESCE(SUM(s.amount), 0) AS total
FROM cal
LEFT JOIN sales s ON s.sale_date = cal.d
GROUP BY cal.d
ORDER BY cal.d;Kerangka Bulanan dan Mingguan
Ubah kenaikannya untuk membangun kalender dengan interval yang lebih besar. Tambahkan INTERVAL '1 month' untuk kerangka bulanan atau INTERVAL '7 day' untuk kerangka mingguan. Ini berguna ketika pewawancara menginginkan laporan per bulan yang juga mencakup bulan-bulan kosong.
WITH RECURSIVE months AS (
SELECT DATE '2024-01-01' AS m
UNION ALL
SELECT m + INTERVAL '1 month' FROM months
WHERE m < DATE '2024-12-01'
)
SELECT m FROM months;Perbedaan Dialek dalam Operasi Tanggal
Aritmetika tanggal adalah bagian yang paling tidak portabel dari kueri-kueri ini. Kenali variasinya:
- Postgres:
d + INTERVAL '1 day'. - MySQL:
DATE_ADD(d, INTERVAL 1 DAY). - SQL Server:
DATEADD(DAY, 1, d). - SQLite:
date(d, '+1 day').
Menyebutkan bahwa struktur rekursinya sama dan hanya fungsi tanggalnya yang berubah merupakan jawaban yang kuat dan menunjukkan pemahaman terhadap berbagai dialek.
Rekursi vs generate_series
Postgres menyediakan generate_series() bawaan yang menghasilkan angka atau tanggal tanpa rekursi, dan cara ini lebih cepat serta lebih jelas:
SELECT generate_series(DATE '2024-01-01', DATE '2024-01-31', INTERVAL '1 day');
Jika basis data yang digunakan pewawancara mendukungnya, pilih cara ini. Namun, banyak mesin basis data (MySQL dan SQL Server sebelum versi-versi terbaru) tidak memilikinya — tepat dalam kondisi inilah CTE rekursif menjadi pengganti yang portabel.
Perhatikan Batas Rekursi
Menghasilkan deret besar dapat mencapai batas rekursi mesin basis data. SQL Server secara bawaan menetapkan MAXRECURSION 100, sehingga kalender 365 hari gagal kecuali Anda menambahkan OPTION (MAXRECURSION 0) untuk menghapus batas tersebut.
Postgres tidak memiliki batas tetap, tetapi deret tak terkendali dengan predikat yang salah dapat terus berjalan sampai memori habis. Selalu pastikan predikat penghentian Anda benar sebelum memperbesar skalanya.
-- SQL Server: lift the 100-row recursion cap
-- ...recursive CTE here...
SELECT * FROM cal
OPTION (MAXRECURSION 0);Menggunakan CROSS JOIN pada Deret
Deret yang dihasilkan sering kali hanyalah salah satu bahan. Setelah memiliki CTE angka, gunakan CROSS JOIN untuk memperluas atau memecah baris — misalnya, untuk mengulang setiap baris pesanan sesuai jumlahnya atau menyebarkan rentang tanggal untuk setiap pelanggan.
Menyadari bahwa rekursi menghasilkan blok pembangun yang dapat digunakan kembali, bukan hanya jawaban akhir, adalah hal yang membedakan jawaban wawancara yang matang dari jawaban hafalan.
WITH RECURSIVE nums AS (
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM nums WHERE n < 10
)
SELECT o.order_id, nums.n AS unit
FROM orders o
JOIN nums ON nums.n <= o.quantity;Pemeriksaan Singkat
Mengapa predikat penghentian sangat penting dalam deret angka atau tanggal?
Ringkasan
Rekursi dapat membuat baris yang tidak ada di tabel mana pun:
- Masukkan nilai pertama ke dalam anchor, lalu lakukan kenaikan di anggota rekursif.
- Selalu tambahkan predikat penghentian secara eksplisit — deret tidak memiliki akhir alami.
- Bangun kerangka tanggal atau angka, lalu gunakan
LEFT JOINpada data fakta danCOALESCEuntuk mengisi celah. - Utamakan
generate_seriesjika tersedia; perhatikanMAXRECURSIONpada SQL Server.
Berikutnya: teknik keselamatan yang mencegah rekursi berjalan tak terkendali.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Membuat Deret Angka dan Tanggal” gratis?
Ya — teks lengkap “Membuat Deret Angka dan Tanggal” 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 “Membuat Deret Angka dan Tanggal”?
Gunakan rekursi untuk menghasilkan deret dalam pengisian celah dan kalender. 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 “Membuat Deret Angka dan Tanggal” 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
- Anggota Anchor dan Rekursif
- Menelusuri Bagan Organisasi
- Membuat Deret Angka dan Tanggal
- Menghindari Rekursi Tak Terbatas