0Pricing
SQL Interview Prep · Pelajaran

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,...,99

Menghasilkan 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 JOIN pada data fakta dan COALESCE untuk mengisi celah.
  • Utamakan generate_series jika tersedia; perhatikan MAXRECURSION pada 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

  1. Anggota Anchor dan Rekursif
  2. Menelusuri Bagan Organisasi
  3. Membuat Deret Angka dan Tanggal
  4. Menghindari Rekursi Tak Terbatas
← Kembali ke SQL Interview Prep