لا يمكن استخدام الاسم المستعار الناتج عن 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 من الأساسيات للاحتراف.