LAG وLEAD للصفوف المتجاورة
الوصول إلى قيم الصف السابق واللاحق دون ربط ذاتي
LAG وLEAD للصفوف المتجاورة درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
السؤال الذي يطرحه المحاورون
من أكثر أسئلة مقابلات محللي البيانات شيوعًا: «قارن كل صف بالصف الذي يسبقه من دون استخدام ربط ذاتي.» فكّر في إيرادات شهر مقارنةً بالشهر السابق، أو آخر تسجيل دخول لمستخدم، أو الحدث التالي في تسلسل.
الإجابة الواضحة هي دالتا النافذة LAG وLEAD. فهما تتيحان للصف الاطلاع على قيمة صف مجاور مع الحفاظ على كل صفوف التفاصيل. ستبني في هذا الدرس نموذجًا ذهنيًا دقيقًا لكيفية تنقلهما بين الصفوف المتجاورة.
ما الذي تفعله LAG وLEAD
تعيد LAG(col) قيمة col من الصف السابق. وتعيد LEAD(col) القيمة من الصف التالي. ويُحدَّد معنى «السابق» و«التالي» بالكامل بواسطة ORDER BY داخل عبارة OVER.
- LAG تنظر إلى الخلف.
- LEAD تنظر إلى الأمام.
كلتاهما دالتا نافذة تعتمد على الإزاحة: لا تدمجان الصفوف مطلقًا، بل تلحقان قيمة صف مجاور بالصف الحالي فحسب.
صيغة LAG الأساسية
إليك البنية الأساسية المعتادة. لدينا جدول sales يحتوي على month وrevenue. ونريد أن يعرض كل صف أيضًا إيرادات الشهر السابق.
تخبر OVER (ORDER BY month) المحرك بكيفية تعريف «السابق». لا يملك الصف الأول صفًا سابقًا، ولذلك تكون قيمة prev_revenue فيه هي NULL.
SELECT
month,
revenue,
LAG(revenue) OVER (ORDER BY month) AS prev_revenue
FROM sales
ORDER BY month;قراءة النتيجة
بالنسبة إلى البيانات 2024-01 = 100 و2024-02 = 130 و2024-03 = 120، يعيد الاستعلام ما يلي:
- يناير: الإيرادات 100، وprev_revenue تساوي NULL
- فبراير: الإيرادات 130، وprev_revenue تساوي 100
- مارس: الإيرادات 120، وprev_revenue تساوي 130
استخرج كل صف القيمة من الصف الموجود فوقه مباشرةً في المجموعة المرتبة. لا حاجة إلى ربط ذاتي أو استعلام فرعي، ولا تُفقد أي صفوف.
LEAD تنظر إلى الأمام
تمثل LEAD الصورة المعاكسة. استخدمها عندما يحتاج الصف إلى معرفة ما سيأتي بعده، مثل تاريخ الشراء التالي لحساب المدة بين الطلبات.
لا يملك الصف الأخير في المجموعة المرتبة صفًا لاحقًا، ولذلك تكون نتيجة LEAD فيه هي NULL.
SELECT
month,
revenue,
LEAD(revenue) OVER (ORDER BY month) AS next_revenue
FROM sales
ORDER BY month;معامل الإزاحة
تقبل الدالتان معاملًا ثانيًا اختياريًا يحدد عدد الصفوف التي يجب تجاوزها. تعود LAG(col, 2) صفين إلى الخلف، بينما تقفز LEAD(col, 3) ثلاثة صفوف إلى الأمام.
يستخدم المحاورون ذلك لطرح أسئلة مثل «الإيرادات قبل شهرين» أو «القيمة الموجودة بعد ثلاثة صفوف». الإزاحة الافتراضية هي 1.
SELECT
month,
revenue,
LAG(revenue, 2) OVER (ORDER BY month) AS revenue_2_months_ago
FROM sales
ORDER BY month;معامل القيمة الافتراضية
يوفر المعامل الثالث قيمة بديلة عندما لا يوجد صف مجاور، بدلًا من الحصول على NULL. وتكون الصيغة LAG(col, offset, default).
يفيد ذلك عندما لا تستطيع عملية لاحقة التعامل مع NULL، مثل اعتبار القيمة السابقة المفقودة 0 حتى يظل بالإمكان حساب الفرق.
SELECT
month,
revenue,
LAG(revenue, 1, 0) OVER (ORDER BY month) AS prev_revenue
FROM sales
ORDER BY month;يعيد PARTITION BY ضبط النافذة
نادرًا ما تحتوي البيانات الواقعية على سلسلة عامة واحدة. فعادةً ما تقارن داخل كل عميل أو منتج أو منطقة. يعيد PARTITION BY بدء حساب LAG/LEAD عند بداية كل قسم.
وهذا يعني أن الصف الأول في كل قسم يحصل على NULL من LAG، ولا تتسرب أي قيمة عبر الحد الفاصل إلى بيانات عميل آخر.
SELECT
customer_id,
order_date,
amount,
LAG(amount) OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS prev_amount
FROM orders;مثال تطبيقي: الأيام بين الطلبات
من المهام الشائعة قياس الفاصل بين طلبات العميل المتتالية. استخرج تاريخ الطلب السابق باستخدام LAG، ثم اطرح التاريخين.
يعطي الطلب الأول لكل عميل القيمة NULL لعدم وجود تاريخ سابق يمكن الطرح منه. وهذا تحديدًا نوع المقارنة لكل عميل الذي يتوقع القائمون بالمقابلات أن تحله دوال النوافذ.
SELECT
customer_id,
order_date,
order_date - LAG(order_date) OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS days_since_prev
FROM orders;لماذا لا نستخدم ربطًا ذاتيًا؟
كان الحل قبل ظهور دوال النوافذ هو استخدام ربط ذاتي مترابط: ربط الجدول بنفسه على أساس «الصف الذي يكون تاريخه أكبر تاريخ أصغر من تاريخ هذا الصف». ينجح هذا الأسلوب، لكنه مطول، وعرضة للأخطاء عند وجود حالات تعادل، وغالبًا ما يكون أبطأ.
- تعبّر
LAG/LEADعن الغرض في سطر واحد. - تُقيَّم في مرور واحد مرتب.
- تُحسم حالات التعادل بصورة حتمية بواسطة
ORDER BYالذي تحدده.
إن قولك «سأستخدم LAG بدلًا من الربط الذاتي» يدل على تمكنك.
خطأ شائع: عدم استخدام ORDER BY
من دون استخدام ORDER BY في عبارة OVER، لا يكون «الصف السابق» محددًا. ترفض بعض محركات قواعد البيانات ذلك، بينما تعيد محركات أخرى نتائج غير متوقعة. رتّب النافذة دائمًا.
تذكّر أيضًا أن الترتيب داخل OVER مستقل عن ORDER BY الخارجي للاستعلام. تحدد النافذة الصف المجاور، بينما تحدد العبارة الخارجية ترتيب العرض فقط.
تحقق سريع
اختبر فهمك لدوال النوافذ ذات الإزاحة.
مراجعة
أصبحت الآن تعرف دوال النوافذ ذات الإزاحة:
- تقرأ
LAG(col)الصف السابق، وتقرأLEAD(col)الصف التالي، وفقًا لـORDER BYالخاص بالنافذة. - المعاملات الاختيارية هي:
LAG(col, offset, default). - يعيد
PARTITION BYضبط التنقل داخل كل مجموعة، لذلك تكون صفوف الحدودNULL. - تستبدل عمليات الربط الذاتي المعقدة للمقارنة بين الصفوف المتجاورة.
سنطبّق ذلك بعد ذلك على السؤال الذي لا يكاد يغيب عن مقابلات المحللين: التغير من فترة إلى أخرى.
الأسئلة الشائعة
هل درس «LAG وLEAD للصفوف المتجاورة» مجاني؟
نعم — نص درس «LAG وLEAD للصفوف المتجاورة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «LAG وLEAD للصفوف المتجاورة»؟
الوصول إلى قيم الصف السابق واللاحق دون ربط ذاتي تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟
لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «LAG وLEAD للصفوف المتجاورة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟
نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- LAG وLEAD للصفوف المتجاورة
- التغير من فترة إلى أخرى
- NTILE لتقسيم الصفوف إلى مجموعات
- FIRST_VALUE وLAST_VALUE وحدود الإطار