كيف نستخدم WHERE لتصفية نتيجة ROW_NUMBER؟

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

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

الإجابة

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

الحل العملي هو حساب الترقيم داخل CTE أو جدول مشتق، ثم إجراء التصفية في استعلام خارجي. في المستوى الخارجي يصبح الرقم عمودًا من أعمدة المصدر، ويمكن التعامل معه في WHERE مثل أي قيمة أخرى متاحة في ذلك المستوى.

مثال

WITH employees AS (
  SELECT 1 AS id, 8000 AS salary
  UNION ALL SELECT 2, 6000
), ranked AS (
  SELECT id,
         ROW_NUMBER() OVER (ORDER BY salary DESC, id) AS rn
  FROM employees
)
SELECT id
FROM ranked
WHERE rn = 1;

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

باختصار: احسب دالة النافذة أولًا داخل استعلام داخلي، ثم صفِّ عمود نتيجتها في استعلام خارجي.

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

اختبر فهمك

الاستعلام الأخير مقصود به عرض أول موظفين في الترتيب لكنه يحتوي خطأ. ما التصحيح المناسب؟

CREATE TABLE employees (
  id INT PRIMARY KEY,
  salary INT NOT NULL
);
INSERT INTO employees (id, salary) VALUES
(1, 8000), (2, 7000), (3, 6000);

SELECT id,
       ROW_NUMBER() OVER (ORDER BY salary DESC, id) AS rn
FROM employees
WHERE rn <= 2;