Persediaan Temu Duga SQL · Pelajaran

Menjana Siri Nombor dan Tarikh

Gunakan rekursi untuk menghasilkan jujukan bagi mengisi jurang dan mencipta kalendar

Pelajaran 3 daripada 413 langkah

Menjana Siri Nombor dan Tarikh ialah pelajaran Persediaan Temu Duga SQL 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 SQL, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.

Rekursi Tanpa Hierarki

CTE rekursif bukan hanya untuk pepohon. Satu lagi kegunaan utama ialah menjana siri: turutan nombor atau setiap tarikh dalam sesuatu julat. Penemu duga sering bertanya tentang perkara ini apabila masalah memerlukan pengisian jurang — iaitu menghasilkan baris yang tidak wujud dalam mana-mana jadual.

Soalan lazimnya begini: "Paparkan jualan bagi setiap hari dalam bulan tersebut, termasuk hari yang tiada jualan." Anda tidak boleh memaparkan hari yang tiada melainkan Anda menjana semua hari terlebih dahulu.

Siri Nombor Mudah

Sauh memulakan nombor pertama; ahli rekursif menambah satu pada setiap lelaran; WHERE dalam ahli rekursif menghentikan proses tersebut. Ini menjana nombor 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 Penamatan

Berbeza daripada carta organisasi, siri nombor tidak mempunyai daun semula jadi untuk dijadikan titik henti — Anda boleh terus menambah nombor selama-lamanya. Oleh itu, Anda mesti menambah syarat berhenti yang jelas dalam ahli rekursif: WHERE n < 10.

Apabila n mencapai 10, WHERE pada lelaran seterusnya menapis keluar satu-satunya baris calon, ahli rekursif tidak mengembalikan apa-apa, lalu rekursi berhenti. Terlupa menambah pengawal ini ialah punca utama rekursi tidak terkawal dalam temu duga.

Menetapkan Parameter Julat

Jadikan siri lebih fleksibel dengan menentukan had daripada suatu nilai atau pemboleh ubah. Di sini, kita menjana nombor 1 hingga N, dengan N dibekalkan sebagai input. Bentuk yang sama boleh menghasilkan siri bermula daripada 0 atau siri dengan langkah tertentu — hanya ubah sauh dan nilai kenaikan.

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

Menjana Siri Tarikh

Gantikan pengiraan integer dengan pengiraan tarikh untuk mendapatkan kalendar. Sauh ialah tarikh mula; ahli rekursif menambah satu hari sehingga melepasi tarikh akhir.

Sintaks untuk menambah satu hari berbeza mengikut dialek — bentuk gaya Postgres ini menggunakan selang.

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 Jurang Dengan LEFT JOIN

Sekarang gabungkan kalendar dengan data sebenar. Jana setiap hari, kemudian gunakan LEFT JOIN pada jadual jualan supaya hari yang tiada muncul dengan nilai NULL, yang Anda tukarkan kepada 0 menggunakan COALESCE.

Pola dua langkah ini — jana rangka dahulu, kemudian lakukan cantuman kiri pada data fakta — ialah teras bagi setiap jawapan pengisian jurang.

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;

Rangka Bulanan dan Mingguan

Ubah nilai kenaikan untuk membina kalendar dengan sela yang lebih besar. Tambah INTERVAL '1 month' untuk rangka bulanan atau INTERVAL '7 day' untuk rangka mingguan. Ini berguna apabila penemu duga mahukan laporan bulanan yang turut merangkumi bulan tanpa data.

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;

Perbezaan Dialek dalam Pengiraan Tarikh

Aritmetik tarikh ialah bahagian yang paling kurang serasi merentas sistem dalam pertanyaan ini. Ketahui variasinya:

  • Postgres: d + INTERVAL '1 day'.
  • MySQL: DATE_ADD(d, INTERVAL 1 DAY).
  • SQL Server: DATEADD(DAY, 1, d).
  • SQLite: date(d, '+1 day').

Dengan menyatakan bahawa struktur rekursinya sama dan hanya fungsi tarikh yang berubah, Anda menunjukkan jawapan yang kukuh serta memahami perbezaan dialek.

Rekursi Berbanding Penjanaan Siri

Postgres menyediakan generate_series() terbina dalam yang menghasilkan nombor atau tarikh tanpa rekursi, dan fungsi ini lebih pantas serta lebih jelas:

SELECT generate_series(DATE '2024-01-01', DATE '2024-01-31', INTERVAL '1 day');

Jika pangkalan data penemu duga menyokongnya, utamakan fungsi tersebut. Namun, banyak enjin seperti MySQL dan SQL Server dalam versi terdahulu tidak menyediakannya — pada ketika inilah CTE rekursif menjadi pilihan sandaran yang serasi merentas sistem.

Perhatikan Had Rekursi

Penjanaan siri yang besar boleh mencapai had rekursi enjin. SQL Server menetapkan MAXRECURSION 100 secara lalai, jadi kalendar 365 hari akan gagal kecuali Anda menambah OPTION (MAXRECURSION 0) untuk menghapuskan had tersebut.

Postgres tidak mempunyai had tetap, tetapi siri yang tidak terkawal dengan predikat yang salah boleh terus berjalan sehingga memori habis. Sentiasa pastikan predikat penamatan Anda betul sebelum meningkatkan skala.

-- SQL Server: lift the 100-row recursion cap
-- ...recursive CTE here...
SELECT * FROM cal
OPTION (MAXRECURSION 0);

Melakukan Cantuman Silang pada Siri

Siri yang dijana sering kali hanyalah satu bahan. Selepas Anda mempunyai CTE nombor, gunakan CROSS JOIN untuk mengembangkan atau menggandakan baris — contohnya, mengulangi setiap baris pesanan mengikut kuantitinya atau mengembangkan julat tarikh bagi setiap pelanggan.

Memahami bahawa rekursi menghasilkan blok binaan yang boleh digunakan semula, bukan sekadar jawapan akhir, membezakan jawapan temu duga yang mantap daripada jawapan yang hanya dihafal.

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;

Semakan Pantas

Mengapakah predikat berhenti penting dalam siri nombor atau tarikh?

Rumusan

Rekursi boleh menghasilkan baris yang tidak wujud dalam mana-mana jadual:

  • Mulakan nilai pertama dalam sauh dan tingkatkan nilainya dalam ahli rekursif.
  • Sentiasa tambah predikat penamatan yang jelas — siri tidak mempunyai penghujung semula jadi.
  • Bina rangka tarikh atau nombor, kemudian gunakan LEFT JOIN pada data fakta dan COALESCE untuk mengisi jurang.
  • Utamakan generate_series jika tersedia; ambil perhatian terhadap MAXRECURSION pada SQL Server.

Seterusnya: teknik keselamatan yang menghalang rekursi daripada berjalan tanpa terkawal.

Percuma untuk bermula

Pelajari SQL 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
30
Pelajaran
120

Soalan Lazim

Adakah pelajaran “Menjana Siri Nombor dan Tarikh” percuma?

Ya — teks penuh “Menjana Siri Nombor dan Tarikh” 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 SQL, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Menjana Siri Nombor dan Tarikh”?

Gunakan rekursi untuk menghasilkan jujukan bagi mengisi jurang dan mencipta kalendar Anda berlatih Persediaan Temu Duga SQL 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 SQL?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga SQL 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 “Menjana Siri Nombor dan Tarikh” 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 SQL ini?

Ya. Setiap pelajaran Persediaan Temu Duga SQL 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

  1. Ahli Sauh dan Rekursif
  2. Merentasi Carta Organisasi
  3. Menjana Siri Nombor dan Tarikh
  4. Mengelakkan Rekursi Tanpa Henti
← Kembali ke Persediaan Temu Duga SQL