إنشاء سلاسل الأرقام والتواريخ
استخدام التكرار لإنشاء تسلسلات لملء الفجوات والتقويمات
إنشاء سلاسل الأرقام والتواريخ درس مجاني في SQL Interview Prep على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.
العودية دون تسلسل هرمي
لا تقتصر CTE العودية على الأشجار. ومن الاستخدامات الرئيسية الأخرى إنشاء المتتاليات: سلسلة من الأرقام أو كل تاريخ ضمن نطاق. يطرح المحاورون هذا النوع من الأسئلة عندما تتطلب المسألة سد الفجوات، أي إنتاج صفوف غير موجودة في أي جدول.
السؤال التقليدي هو: "اعرض المبيعات لكل يوم من الشهر، بما في ذلك الأيام التي لا توجد فيها مبيعات." لا يمكنك عرض يوم مفقود ما لم تُنشئ جميع الأيام أولًا.
سلسلة أرقام بسيطة
تُهيّئ نقطة الارتكاز الرقم الأول؛ ويضيف العضو العودي واحدًا في كل تكرار؛ ويوقفه شرط WHERE في العضو العودي. ينتج هذا الأرقام من 1 إلى 10.
WITH RECURSIVE nums AS (
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM nums WHERE n < 10
)
SELECT n FROM nums;شرط الإنهاء
بخلاف المخطط التنظيمي، لا تحتوي سلسلة الأرقام على عقدة ورقية طبيعية تتوقف عندها — إذ يمكنك زيادة الرقم إلى ما لا نهاية. لذلك يجب إضافة شرط توقف صريح في العضو العودي: WHERE n < 10.
عندما تصل n إلى 10، يستبعد شرط WHERE في التكرار التالي الصف المرشح الوحيد، ويُرجع العضو العودي لا شيء، فتتوقف العودية. ويُعد نسيان هذا الحاجز السبب الأول للعودية غير المنضبطة في المقابلات.
تخصيص النطاق بالمعلمات
اجعل السلسلة مرنة من خلال تحديد الحد باستخدام قيمة أو متغير. نُنشئ هنا سلسلة من 1 إلى N، حيث تُمرَّر قيمة N. وينتج الشكل نفسه سلاسل تبدأ من الصفر أو سلاسل بخطوة محددة — ما عليك سوى تغيير نقطة الارتكاز وقيمة الزيادة.
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إنشاء سلسلة تواريخ
استبدل العمليات الحسابية على الأعداد الصحيحة بعمليات على التواريخ لتحصل على تقويم. يكون تاريخ البداية هو نقطة الارتكاز، ويضيف العضو العودي يومًا واحدًا حتى يتجاوز تاريخ النهاية.
تختلف صياغة إضافة يوم من لهجة SQL إلى أخرى — ويستخدم هذا الشكل، بأسلوب Postgres، فترة زمنية.
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;سد الفجوات باستخدام LEFT JOIN
اجمع الآن بين التقويم والبيانات الفعلية. أنشئ كل يوم، ثم استخدم LEFT JOIN لربط جدول المبيعات، حتى تظهر الأيام المفقودة بقيمة NULL تحوّلها إلى 0 باستخدام COALESCE.
هذا النمط ذو الخطوتين — إنشاء العمود الفقري، ثم ربط البيانات الفعلية باستخدام LEFT JOIN — هو جوهر كل إجابة تتعلق بسد الفجوات.
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;الهياكل الأساسية الشهرية والأسبوعية
غيّر قيمة الزيادة لإنشاء تقاويم بفواصل زمنية أكبر. أضف INTERVAL '1 month' لإنشاء هيكل أساسي شهري، أو INTERVAL '7 day' لأسابيع. ويفيد ذلك عندما يريد المحاور تقريرًا شهريًا يتضمن الأشهر الخالية.
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;اختلافات اللهجات في حساب التواريخ
تُعد العمليات الحسابية على التواريخ الجزء الأقل قابلية للنقل بين هذه الاستعلامات. تعرّف على الصيغ المختلفة:
- Postgres:
d + INTERVAL '1 day'. - MySQL:
DATE_ADD(d, INTERVAL 1 DAY). - SQL Server:
DATEADD(DAY, 1, d). - SQLite:
date(d, '+1 day').
إن الإشارة إلى أن بنية العودية متطابقة وأن دالة التاريخ وحدها هي التي تتغير تُعد إجابة قوية تراعي اختلاف اللهجات.
العودية في مقابل generate_series
يوفر Postgres دالة مضمّنة باسم generate_series() تُنتج أرقامًا أو تواريخ دون عودية، وهي أسرع وأوضح:
SELECT generate_series(DATE '2024-01-01', DATE '2024-01-31', INTERVAL '1 day');
إذا كان محرك قاعدة البيانات الذي يستخدمه المحاور يدعمها، ففضّل استخدامها. لكن العديد من المحركات، مثل MySQL وSQL Server قبل الإصدارات الحديثة، لا توفرها — وهنا تحديدًا تكون CTE العودية البديل القابل للنقل بين المحركات.
انتبه إلى حد العودية
قد يؤدي إنشاء سلسلة كبيرة إلى بلوغ حد العودية الذي يفرضه المحرك. يعيّن SQL Server القيمة الافتراضية إلى MAXRECURSION 100، لذلك يفشل تقويم مدته 365 يومًا ما لم تُلحق بالاستعلام العبارة OPTION (MAXRECURSION 0) لإلغاء الحد.
لا يفرض Postgres حدًا ثابتًا، لكن السلسلة غير المنضبطة الناتجة عن شرط خاطئ قد تستمر حتى تنفد الذاكرة. تحقّق دائمًا من صحة شرط الإنهاء قبل التوسّع.
-- SQL Server: lift the 100-row recursion cap
-- ...recursive CTE here...
SELECT * FROM cal
OPTION (MAXRECURSION 0);الربط التبادلي مع السلسلة
غالبًا ما تكون السلسلة المُنشأة مجرد مكوّن. بعد إنشاء CTE للأرقام، استخدم CROSS JOIN لتوسيع الصفوف أو تفكيكها — مثلًا لتكرار كل صف طلب بحسب كميته، أو لتوسيع نطاق من التواريخ لكل عميل.
إن إدراك أن العودية تنتج لبنة قابلة لإعادة الاستخدام، وليس مجرد إجابة نهائية، هو ما يميّز إجابة مقابلة متقنة عن إجابة محفوظة.
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;تحقق سريع
لماذا يُعد شرط الإيقاف بالغ الأهمية في سلسلة من الأرقام أو التواريخ؟
الخلاصة
يمكن للعودية إنشاء صفوف غير موجودة في أي جدول:
- هيّئ القيمة الأولى في نقطة الارتكاز، ثم زدها في العضو العودي.
- أضف دائمًا شرط إنهاء صريحًا — فالسلاسل لا تملك نهاية طبيعية.
- أنشئ عمودًا فقريًا للتواريخ أو الأرقام، ثم استخدم
LEFT JOINلربط البيانات الفعلية وCOALESCEلسد الفجوات. - فضّل
generate_seriesعند توفرها، وانتبه إلىMAXRECURSIONفي SQL Server.
التالي: تقنيات الأمان التي تمنع العودية من الاستمرار بلا توقف.
الأسئلة الشائعة
هل درس «إنشاء سلاسل الأرقام والتواريخ» مجاني؟
نعم — نص درس «إنشاء سلاسل الأرقام والتواريخ» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «إنشاء سلاسل الأرقام والتواريخ»؟
استخدام التكرار لإنشاء تسلسلات لملء الفجوات والتقويمات تتمرن على SQL Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Interview Prep؟
لا تُشترط خبرة سابقة. SQL Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «إنشاء سلاسل الأرقام والتواريخ»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Interview Prep هذا؟
نعم. كل درس في SQL Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الأعضاء الأساسيون والتكراريون
- التنقل في المخطط التنظيمي
- إنشاء سلاسل الأرقام والتواريخ
- تجنب التكرار اللانهائي