في هذه الصفحة
المقدمة
النهاردة معانا موضوع مهم جدا والمفروض بعد مانقرأ المقال ده هنلاقي نفسنا بقينا بنوفر وقت وجهد كبير في كتابة بعض ال 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 بتقدر تعمل كده تعالو نشوف ..
تقدروا دلوقتي تشتركوا في النشرة الأسبوعية لاقرأ-تِك بشكل مجاني تمامًا عشان يجيلكوا كل جديد بشكل أسبوعي فيما يخص مواضيع متنوعة وبشروحات بسيطة وسهلة وبجودة عالية 🚀
النشرة هيكون ليها شكل جديد ومختلف عن شكلها القديم وهنحاول انها تكون مميزة ومختلفة وخليط بين المحتوى الأساسي اللي بينزل ومفاجآت تانية كتير 🎉
بفضل الله قمنا بإطلاق قناة اقرأ-تِك على التليجرام مجانًا للجميع 🚀
آملين بده اننا نفتح باب تاني لتحقيق رؤيتنا نحو إثراء المحتوى التقني باللغة العربية ، ومساعدة لكل متابعينا في انهم يوصلوا لجميع أخبار اقرأ-تِك من حيث المقالات ومحتوى ورقة وقلم والنشرة الأسبوعية وكل جديد بطريقة سريعة وسهلة
مستنينكوا تنورونا , وده رابط القناة 👇
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 اللي هنتكلم عليهم وهي هنا مهتمها انها تحط ترتيب معين لكل صف من الصفوف اللي في الجدول السابق اللي جيبنه فيه مجموع درجات كل طالب
عشان تكون النتيجة النهائية لل query :
RowNumber | Total_Score | Student_Id |
---|---|---|
1 | 21 | 202 |
2 | 17 | 101 |
3 | 16 | 303 |
طيب لو انا بقى عاوز اعرف مين الاول في كل مادة من المواد ومين التاني والثالت وهكذا يعني هقسمهم بناء على كل ماده واصنفهم في كل ماده ده هيحصل من خلال اننا هنضيف كلمه جديده في ال query بتاعنا اسمها PARTITION BY عشان اقسمهم على كل ماده وبعدين اصنفهم كالتالي :
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() واعرف التكرار وامسحه . تعالو نشوف ازاي في الصورة دي :
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()"