Optimizing SQL Queries Using Rank Function Row_Number

كلنا بنحتك بشكل كبير بقواعد البيانات ، وأصبح من المهم دلوقتي أن يكون عندنا مهارة قوية في التعامل مع الـ SQL ونكتب Queries تكون قوية وفعالة وعشان كده خلونا نشوف الـ Row Number وحكايته مع الـ Ranking Functions
Optimizing SQL Queries Using Rank Function Row_Number
Optimizing SQL Queries Using Rank Function Row_Number()

في هذه الصفحة

المقدمة

النهاردة معانا موضوع مهم جدا والمفروض بعد مانقرأ المقال ده هنلاقي نفسنا بقينا بنوفر وقت وجهد كبير في كتابة بعض ال Queries اللي ليها علاقة بموضعنا النهاردة ألا وهي ال Ranking Functions .. طب ايه هي وفيم تستخدم وما أهميتها ؟ كل هذا وأكثر في هذا المقال ان شاء الله.


Rank Function in SQL

أولا يعني ايه كلمة  Rank ؟

كلمة "rank" بالإنجليزية معناها "ترتيب" أو "رتبة". في السياق العام، تستخدم للإشارة إلى موضع أو مستوى شيء معين ضمن مجموعة. 

في عالم البيانات وSQL، تعني "Rank" تحديد موضع كل صف بناءً على قيمة معينة. مثلاً، لما نقول إن "الشخص X لديه رتبته 1 في المبيعات"، يعني إنه الأفضل في مجموعة معينة بناءً على مبيعاته يعني تصنيفه بين زملائة اللي شغاليين معاه في المبيعات نفس الشغلانه هو الاول بينهم.

ببساطة، "Rank" بتدل على كيفية تصنيف شيء بالنسبة لآخرين.

في الـ SQL  في 4 انواع للـ Ranking Functions  تعالو نتعرف عليهم: 

  • RANK()
  • DENSE_RANK()
  • ROW_NUMBER()
  • NTILE()

وقبل مانتعرف عليهم واحد واحد تعالو الاول نتخيل مجوعة من الداتا عشان نطبق عليها الأنواع الأربعة من الـ Ranking Functions ، فمثلا تخيل ياصديقي أن الداتا هي درجات الطلاب في ثلاث مواد دراسية : (رياضيات وكيمياء وتاريخ).

 كالتالي :

Final_Score Subject Student_Id
8 Maths 101 0
4 Chemistry 101 1
5 History 101 2
6 Maths 202 3
8 Chemistry 202 4
7 History 202 5
5 Maths 303 6
9 Chemistry 303 7
2 History 303 8

لو انا عاوز اصنف او ارتب او اعمل Rank  للطلاب بناء على المجموع الكلي الـ Total Score فعاوز أعرف مين الطالب اللي طلع الأول ومين التاني وهكذا ... نعمل كده ازاي ؟ 

وقبل أي حاجة .. ازاي اصلا نحسب المجموع الكلي لكل طالب ؟ 

بكل سهولة عندنا الـ Sum Function بتقدر تعمل كده تعالو نشوف ..


تقدروا دلوقتي تشتركوا في النشرة الأسبوعية لاقرأ-تِك بشكل مجاني تمامًا عشان يجيلكوا كل جديد بشكل أسبوعي فيما يخص مواضيع متنوعة وبشروحات بسيطة وسهلة وبجودة عالية 🚀

النشرة هيكون ليها شكل جديد ومختلف عن شكلها القديم وهنحاول انها تكون مميزة ومختلفة وخليط بين المحتوى الأساسي اللي بينزل ومفاجآت تانية كتير 🎉

Eqraatech Newsletter | Eqraatech - اقرأ-تِك | Substack
محتوى تقني متميز في مختلف مجالات هندسة البرمجيات باللغة العربية عن طريق تبسيط المفاهيم البرمجية المعقدة بشكل سلس وباستخدام صور توضيحية مذهلة. Click to read Eqraatech Newsletter, a Substack publication with hundreds of subscribers.

بفضل الله قمنا بإطلاق قناة اقرأ-تِك على التليجرام مجانًا للجميع 🚀

آملين بده اننا نفتح باب تاني لتحقيق رؤيتنا نحو إثراء المحتوى التقني باللغة العربية ، ومساعدة لكل متابعينا في انهم يوصلوا لجميع أخبار اقرأ-تِك من حيث المقالات ومحتوى ورقة وقلم والنشرة الأسبوعية وكل جديد بطريقة سريعة وسهلة

مستنينكوا تنورونا , وده رابط القناة 👇

https://t.me/eqraatechcom


SELECT student_id, SUM(final_score) AS total_score FROM df

حيث الـ df  هو اسم الـ Dataset أو الجدول بتاعنا وبكده نكون قدرنا نجمع درجات كل طالب والنتيجة هتبقة كده: 

Total_Score Student_Id
17 101
21 202
16 303

تمام انت كده قدرت تجيب المجموع النهائي لكل طالب عاوزين بقى نصنفهم ونعمل Ranking ونعرف مين الاول والتاني ، وده كان ممكن نعمله من الأول في خطوه و Query واحدة. 


ROW_NUMBER

ازاي بقى الكلام ده ؟ تعالو نشوف ال query  ده ؟

SELECT *,
ROW_NUMBER() OVER(ORDER BY total_score DESC) RowNumber
FROM (SELECT student_id, SUM(final_score) AS total_score FROM df GROUP BY student_id)

هنلاحظ هنا اننا استخدمنا ROW_NUMBER()  وهي واحدة من الأربعة Ranking Functions اللي هنتكلم عليهم وهي هنا مهتمها انها تحط ترتيب معين لكل صف من الصفوف اللي في الجدول السابق اللي جيبنه فيه مجموع درجات كل طالب 

Optimizing SQL Queries Using Rank Function Row_Number()

عشان تكون النتيجة النهائية لل query : 

RowNumber Total_Score Student_Id
1 21 202
2 17 101
3 16 303

طيب لو انا بقى عاوز اعرف مين الاول في كل مادة من المواد ومين التاني والثالت وهكذا يعني هقسمهم بناء على كل ماده واصنفهم في كل ماده ده هيحصل من خلال اننا هنضيف كلمه جديده في ال query  بتاعنا اسمها  PARTITION BY عشان اقسمهم على كل ماده وبعدين اصنفهم كالتالي : 

Optimizing SQL Queries Using Rank Function Row_Number()
SELECT *,
ROW_NUMBER() OVER (PARTITION BY subject ORDER BY final_score DESC) RowNumber
FROM df
Row_number Final_score Subject Student_Id
1 9 Chemistry 303
2 8 Chemistry 202
3 4 Chemistry 101
1 8 Maths 101
2 6 Maths 202
3 5 Maths 303
1 7 History 202
2 5 History 101
3 2 History 303

وبكده اكون عرفت وصنفت الطلاب الحاصلين على المركز الاول والثاني والثالث في كل ماده.

طيب ايه تاني ممكن يفيدني من استخدام ال Row_number () ؟

كمان اقدر استفيد منها في اني اعرف عدد الصفوف المكرر بناء على عمود معين وامسح التكرار يعني لو في داتا حصلها insert بالغلط وادت لحدوث تكرار في الدتا فاقدر اعمل query  باستخدام ال row_number()  واعرف التكرار وامسحه . تعالو نشوف ازاي في الصورة دي : 

A screen shot of a computer

Description automatically generated
Optimizing SQL Queries Using Rank Function Row_Number()
WITH CTE AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY FirstName ORDER BY CustomerID) AS rn
FROM Customers
)
DELETE FROM CTE
WHERE rn > 1

في الختام

وبكده نكون اتعرفنا عن اول نوع من انواع ال Ranking Functions  وعرفنا اهميته واستخدامتها ، والى اللقاء في الجزء التاني ال "DENSE_RANK()"

اشترك الآن بنشرة اقرأ-تِك الأسبوعية

لا تدع أي شيء يفوتك. واحصل على أحدث المقالات المميزة مباشرة إلى بريدك الإلكتروني وبشكل مجاني!