الدرس 7 من 10
الأول في كل مجموعة
- 15 دقيقة
- 5 معايير للتصحيح
- 3 تلميحات
- إلى المطلوب
هدف الدرس
ROW_NUMBER و PARTITION BY
الشرح
GROUP BY يطوي كل مجموعة في صفّ واحد فتضيع تفاصيلها. دالّة النافذة تحسب عبر مجموعة من الصفوف وتُبقي كل صفّ في مكانه.
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY total DESC) يرقّم طلبات كل عميل على حدة: PARTITION BY يقسم الصفوف مجموعات، وORDER BY يرتّب داخل كل مجموعة، فالرقم 1 أكبر طلبات العميل. وRANK() مثله، إلا أنه يعطي المتعادلَين الرقم نفسه.
ولا تقبل WHERE دالّة نافذة، لأن النوافذ تُحسب بعد التصفية. رقّم داخل WITH، ثم اكتب WHERE rn = 1 في الاستعلام الخارجي.
المطلوب
اعرض أكبر طلب لكل عميل: name وplaced_on وtotal، من الأكبر.
معايير التصحيح
5 معايير- الأعمدة name و placed_on و total
- صفّ واحد لكل عميل له طلبات
- كل صفّ أكبر طلبات صاحبه
- التاريخ تاريخ ذلك الطلب
- من الأكبر إلى الأصغر
الجداول المتاحة في هذا الدرس
CREATE TABLE customers ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, city TEXT NOT NULL ); CREATE TABLE orders ( id INTEGER PRIMARY KEY, customer_id INTEGER REFERENCES customers(id), total INTEGER NOT NULL, placed_on TEXT NOT NULL ); INSERT INTO customers (id, name, city) VALUES (1, 'ليان', 'الرياض'), (2, 'خالد', 'جدة'), (3, 'ريم', 'الدمام'), (4, 'فهد', 'الرياض'); INSERT INTO orders (customer_id, total, placed_on) VALUES (1, 120, '2026-09-01'), (1, 80, '2026-09-12'), (2, 300, '2026-09-03'), (3, 45, '2026-09-20'), (2, 60, '2026-09-25'); INSERT INTO customers (id, name, city) VALUES (5, 'سارة', 'جدة'); CREATE TABLE products ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, price INTEGER NOT NULL ); CREATE TABLE order_items ( id INTEGER PRIMARY KEY, order_id INTEGER REFERENCES orders(id), product_id INTEGER REFERENCES products(id), qty INTEGER NOT NULL ); INSERT INTO products (id, name, price) VALUES (1, 'دفتر', 15), (2, 'قلم', 5), (3, 'حقيبة', 90), (4, 'آلة حاسبة', 60), (5, 'مصباح', 100); INSERT INTO order_items (order_id, product_id, qty) VALUES (1, 3, 1), (1, 1, 2), (2, 4, 1), (2, 2, 4), (3, 3, 2), (3, 4, 2), (4, 1, 3), (5, 1, 2), (5, 2, 6);