ما الفرق بين الترتيب العام والترتيب داخل كل قسم؟

متوسطقراءة دقيقةآخر تحديث 3 أكتوبر 2026

SQL قواعد البيانات

الإجابة

يمكن للاستعلام نفسه حساب ترتيب الموظف بين جميع الموظفين وترتيبه داخل قسمه. عندما لا نكتب PARTITION BY، تتعامل دالة النافذة مع الصفوف كلها باعتبارها قسمًا واحدًا. وعندما نضيف التقسيم بحسب القسم الإداري، تبدأ عملية ترتيب مستقلة لكل قسم.

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

مثال

WITH employees AS (
  SELECT 1 AS id, 'IT' AS department, 9000 AS salary
  UNION ALL SELECT 2, 'HR', 8000
  UNION ALL SELECT 3, 'IT', 7000
)
SELECT id,
       ROW_NUMBER() OVER (
         ORDER BY salary DESC, id
       ) AS global_rn,
       ROW_NUMBER() OVER (
         PARTITION BY department ORDER BY salary DESC, id
       ) AS department_rn
FROM employees
ORDER BY id;

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

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

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

اختبر فهمك

ما الزوج (global_rn, department_rn) للموظف ذي id = 2 في النتيجة التالية؟

CREATE TABLE employees (
  id INT PRIMARY KEY,
  department VARCHAR(20) NOT NULL,
  salary INT NOT NULL
);
INSERT INTO employees (id, department, salary) VALUES
(1, 'IT', 9000), (2, 'HR', 8000), (3, 'IT', 7000);

SELECT id,
       ROW_NUMBER() OVER (ORDER BY salary DESC, id) AS global_rn,
       ROW_NUMBER() OVER (
         PARTITION BY department ORDER BY salary DESC, id
       ) AS department_rn
FROM employees
ORDER BY id;