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 الكامل بالعربي.