اختيار أحدث طلب مدفوع لكل عميل يتطلب تصفية الطلبات المدفوعة قبل حساب ترتيبها. إذا رتبنا جميع الطلبات أولًا ثم فحصنا حالة الطلب الأول، فقد يختفي عميل لديه طلب حديث غير مدفوع وطلب أقدم مدفوع. السؤال المطلوب يتعلق بالأحدث بين الطلبات المؤهلة فقط.
نضع شرط الدفع داخل المرحلة التي تقرأ الطلبات، ونحسب ROW_NUMBER() مع تقسيم بحسب العميل. نرتب وقت الإنشاء تنازليًا، ثم المعرّف تنازليًا لحسم تعادل الوقت. في الاستعلام الخارجي نختار الرقم واحد، فنحصل على طلب واحد لكل عميل لديه طلب مدفوع.
مثال
WITH orders AS (
SELECT 1 AS id, 10 AS customer_id,
CAST('2026-01-01 10:00:00' AS DATETIME) AS created_at,
'paid' AS status
UNION ALL
SELECT 2, 10, '2026-01-02 10:00:00', 'pending'
), ranked AS (
SELECT id, customer_id,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY created_at DESC, id DESC
) AS rn
FROM orders
WHERE status = 'paid'
)
SELECT id, customer_id
FROM ranked
WHERE rn = 1;
العميل الذي لا يملك طلبًا مدفوعًا لا يظهر في هذه النتيجة. وإذا كان المطلوب إظهار جميع العملاء مع قيمة فارغة عند غياب طلب مؤهل، نحتاج إلى ربط هذه النتيجة بمصدر العملاء بصورة تحافظ على صفوفهم.
باختصار: صفِّ الطلبات المؤهلة أولًا، ثم رتّبها داخل كل عميل واختر الصف الأول وفق قاعدة تعادل واضحة.
هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.