0Pricing
Coding Interview Prep · درس

مقارنة الصفوف داخل جدول واحد

أنماط الربط الذاتي للعثور على الأزواج والتكرارات والسجلات المتجاورة

مقارنة الصفوف داخل جدول واحد درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.

استخدام الربط الذاتي لمقارنة الصفوف

إلى جانب التدرجات الهرمية، يتمثل الاستخدام الرئيسي الآخر للربط الذاتي في مقارنة صفوف الجدول نفسه بعضها ببعض. فبدلًا من إقران الأصل بالفرع، تقرن صفوفًا عشوائية للعثور على التكرارات أو الصفوف المتشابهة تقريبًا أو السجلات المتجاورة.

النمط نفسه: امنح الجدول اسمين مستعارين، واكتب شرط ON يعبّر عن العلاقة بين الصفين اللذين تريد إقرانهما.

العثور على أزواج في المجموعة نفسها

سؤال كلاسيكي: اعثر على كل أزواج الموظفين الذين يعملون في القسم نفسه. اربط الجدول بنفسه وفق تساوي القسم، مع إبقاء الصفين مختلفين.

سيقرن الربط الساذج كل موظف بنفسه أيضًا، وينتج كل زوج مرتين. سنصلح ذلك في الخطوة التالية.

SELECT a.name, b.name, a.department
FROM employees a
JOIN employees b ON a.department = b.department;

إزالة الأزواج الذاتية والتكرارات المعكوسة

توجد مشكلتان عند إقران الصفوف في المجموعة نفسها: يطابق الصف نفسه، مثل Alice مع Alice، ويظهر كل زوج مرتين، مثل Alice-Bob وBob-Alice.

أصلح المشكلتين باستخدام متباينة واحدة: a.id < b.id. فهذا يضمن اختلاف الصفين ويحافظ على ترتيب واحد فقط لكل زوج.

SELECT a.name, b.name, a.department
FROM employees a
JOIN employees b
  ON a.department = b.department
 AND a.id < b.id;

لماذا a.id < b.id وليس a.id <> b.id

يؤدي استخدام a.id <> b.id إلى إزالة الأزواج الذاتية، لكنه يعيد الترتيبين معًا، ما يضاعف النتائج. أما استخدام a.id < b.id فيزيل الأزواج الذاتية ويزيل التكرار المعكوس دفعة واحدة.

يراقب القائمون على المقابلات تحديدًا اختيار < بدلًا من <>؛ فهذا يوضح فهمك للتوافقيات في الروابط الذاتية.

-- <>  keeps Alice-Bob AND Bob-Alice (duplicated)
-- <   keeps only Alice-Bob (correct unique pairs)

العثور على الصفوف المكررة

للعثور على السجلات التي تتطابق في أعمدة المفاتيح، أجرِ ربطًا ذاتيًا وفق تلك الأعمدة، واشترط اختلاف المفاتيح الأساسية.

نكشف هنا عن العملاء الذين يستخدمون عنوان البريد الإلكتروني نفسه. ويضمن a.id < b.id ظهور كل زوج مكرر مرة واحدة. وغالبًا ما يكون GROUP BY ... HAVING COUNT(*) > 1 أوضح، لكن الربط الذاتي يعرض الأزواج المخالفة الفعلية جنبًا إلى جنب.

SELECT a.id, b.id, a.email
FROM customers a
JOIN customers b
  ON a.email = b.email
 AND a.id < b.id;

مقارنة السجلات المتجاورة

مهمة شائعة للمحللين: مقارنة كل صف بالصف التالي في التسلسل، مثل مقارنة مبيعات كل يوم بمبيعات اليوم السابق. ويمكن للربط الذاتي إقران الصفوف المتتالية.

نربط هنا كل يوم بالصف الذي يسبقه بيوم واحد بالضبط لحساب الفرق. وينجح ذلك عندما لا توجد فجوات في التسلسل.

SELECT t.day, t.amount,
       t.amount - y.amount AS change_vs_prev
FROM daily_sales t
JOIN daily_sales y
  ON y.day = t.day - INTERVAL '1 day';

مشكلة الفجوات في الروابط الذاتية للتجاور

يتعطل الاستعلام السابق إذا كان أحد الأيام مفقودًا: فلا يوجد صف يسبق ذلك اليوم بيوم واحد بالضبط، ولذلك يُسقط الصف باستخدام الربط الداخلي أو يتعين عليك التعامل مع قيم NULL.

ولهذا يوجّهك القائمون على المقابلات غالبًا إلى دوال النوافذ مثل LAG عند طلب «المقارنة بالصف السابق»، إذ تستخدم الموضع الترتيبي بدلًا من مطابقة قيمة، وتتعامل مع الفجوات بسلاسة.

-- LAG handles gaps; the self join assumed contiguous days
SELECT day, amount,
       amount - LAG(amount) OVER (ORDER BY day) AS change_vs_prev
FROM daily_sales;

الربط الذاتي مقابل دالة النافذة

افهم المفاضلة:

  • يقارن الربط الذاتي الصفوف استنادًا إلى علاقة بين القيم (القسم نفسه أو التاريخ السابق). وهو مرن، لكنه قد يؤدي إلى تضاعف الصفوف والتعامل مع الفجوات بصورة غير صحيحة.
  • تقارن دالة النافذة الصفوف حسب الموضع الترتيبي داخل قسم مرتب. وهي أوضح في منطق الصف السابق أو التالي.

عند الحاجة إلى «المقارنة مع الصف المجاور»، يُفضَّل استخدام LAG/LEAD. أما عند الحاجة إلى «العثور على كل الأزواج التي تطابق شرطًا»، فالربط الذاتي هو الأداة الطبيعية.

العثور على الصفوف التي تتفوق على نظيراتها

إليك نمطًا آخر: العثور على الموظفين الذين يكسبون أكثر من زميل واحد على الأقل في قسمهم. يعبّر الربط الذاتي عن ذلك مباشرة.

نربط كل موظف بالموظفين الآخرين في القسم نفسه ممن يكسبون أقل، ثم نحتفظ بالموظفين المميزين الذين يظهرون في النتيجة. وتكاد هذه الصياغة تُقرأ مثل الجملة الأصلية.

SELECT DISTINCT a.name, a.department, a.salary
FROM employees a
JOIN employees b
  ON a.department = b.department
 AND a.salary > b.salary;

انتبه إلى تضاعف الصفوف

تؤدي عمليات الربط الذاتي على عمود غير فريد إلى مضاعفة الصفوف. فعند إنشاء أزواج داخل قسم يضم 100 شخص، نحصل على نحو 100 × 100 زوج محتمل قبل التصفية.

أدرج دائمًا شرط إزالة التكرار (a.id < b.id)، وأضف DISTINCT أو التجميع عندما تحتاج إلى الصفوف المشاركة فقط، لا إلى كل زوج. واذكر في المقابلات أنك تضع هذا الوعي بتضاعف الصفوف في الحسبان.

اختيار أداة المقارنة

دليل اتخاذ القرار للمقارنة داخل الجدول:

  • كل الأزواج المتطابقة (التكرارات أو التركيبات ضمن المجموعة نفسها): استخدم الربط الذاتي مع a.id < b.id.
  • الصف السابق أو التالي ضمن ترتيب: استخدم دالة نافذة (LAG/LEAD).
  • مقارنة كل صف مع تجميع المجموعة: استخدم استعلامًا فرعيًا مترابطًا أو تجميعًا عبر دالة نافذة.

اختبار سريع

تريد كل زوج فريد من المنتجات التي تنتمي إلى الفئة نفسها، من دون إقران أي منتج بنفسه ومن دون تكرار بسبب اختلاف الترتيب.

مراجعة: مقارنة الصفوف داخل جدول واحد

أهم النقاط:

  • استخدم الربط الذاتي للجدول لإقران صفوفه ببعضها عند العثور على التكرارات أو إنشاء تركيبات ضمن المجموعة نفسها.
  • استخدم a.id < b.id لإزالة إقرانات الصف بنفسه والتكرارات المعكوسة بترتيب واحد.
  • تفشل مقارنات التجاور باستخدام الربط الذاتي عند وجود فجوات؛ لذا يُفضَّل استخدام LAG/LEAD لمنطق الصف السابق أو التالي.
  • ضع دائمًا تضاعف الصفوف في الحسبان عند الربط على أعمدة غير فريدة.

الأسئلة الشائعة

هل درس «مقارنة الصفوف داخل جدول واحد» مجاني؟

نعم — نص درس «مقارنة الصفوف داخل جدول واحد» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.

ماذا ستتعلم في «مقارنة الصفوف داخل جدول واحد»؟

أنماط الربط الذاتي للعثور على الأزواج والتكرارات والسجلات المتجاورة تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟

لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «مقارنة الصفوف داخل جدول واحد»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟

نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. CROSS JOIN والجداءات الديكارتية
  2. SELF JOIN للتسلسلات الهرمية
  3. مقارنة الصفوف داخل جدول واحد
  4. اختيار نوع الربط المناسب
← العودة إلى Coding Interview Prep