تخطَّ إلى المحتوى

OVER

دالة نافذة تعمل على مجموعة صفوف بدون تلخيصها OVER

OVER يحوّل دالة (مثل SUM أو ROW_NUMBER) إلى دالة نافذة (Window Function) تُحسب لكل صف بالنظر إلى مجموعة من الصفوف المرتبطة به، دون دمج تلك الصفوف في صف واحد.

OVER يُلحَق بدالة لتصبح دالة نافذة: تُحسب قيمتها لكل صف بالاستناد إلى مجموعة صفوف مرتبطة (تحدَّد بـ PARTITION BY)، لكن كل صف يبقى ظاهرًا في النتيجة بخلاف GROUP BY الذي يلخّص كل مجموعة بصف واحد. يقبل PARTITION BY لتقسيم الصفوف إلى مجموعات، وORDER BY داخلي لتحديد ترتيب الحساب (مهم لدوال الترتيب والتراكم).

من أشهر الدوال المستخدمة معه: ROW_NUMBER وRANK وDENSE_RANK للترقيم، وLAG وLEAD للوصول لصف سابق أو لاحق، ودوال التجميع العادية (SUM، AVG، COUNT) لحساب مجاميع تراكمية أو مقارنات ضمن كل مجموعة.

الصياغة

function_name(...) OVER (
  [PARTITION BY column]
  [ORDER BY column]
)

📄 مثال

SELECT
  name, department, salary,
  AVG(salary) OVER (PARTITION BY department) AS dept_avg,
  ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees;

أهم النقاط

النقطةالوظيفة
PARTITION BYيقسّم الصفوف إلى مجموعات يُحسب لكل واحدة منها القيمة على حدة
ORDER BY داخل OVERيحدّد ترتيب الحساب داخل كل مجموعة — مهم لـ ROW_NUMBER وLAG/LEAD والمجموع التراكمي
ROW_NUMBER / RANK / DENSE_RANKترقيم أو ترتيب الصفوف، تختلف في التعامل مع القيم المتساوية
LAG / LEADالوصول إلى قيمة من صف سابق أو لاحق ضمن نفس المجموعة

💡 نصائح عملية

  • لا يمكن استخدام دالة نافذة مباشرة داخل WHERE أو HAVING — لف الاستعلام بـ CTE أو استعلام فرعي إن أردت تصفية نتيجتها
  • SUM(...) OVER (ORDER BY col) بلا PARTITION BY يعطي مجموعًا تراكميًا من أول صف حتى الصف الحالي

⚠️ أخطاء شائعة

  • الخلط بين ORDER BY الخارجي (لعرض النتيجة) وORDER BY داخل OVER (يتحكّم بترتيب الحساب) — الاثنان مستقلّان
  • استخدام دالة نافذة ظنًا أنها ستُلخّص الصفوف مثل GROUP BY، بينما هي تحافظ على كل صف كما هو

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار SQL الكامل بالعربي.