تعد وظيفة RANK في SQL Server نوعًا من وظيفة التصنيف. هذه الوظيفة سوف قم بتعيين الرقم لكل صف داخل قسم الإخراج . يقوم بتعيين رتبة لكل صف كواحد بالإضافة إلى رتبة الصف السابق. عندما تعثر الدالة RANK على قيمتين متطابقتين داخل نفس القسم، فإنها تقوم بتعيينهما بنفس رقم التصنيف. بالإضافة إلى ذلك، الرقم التالي في الترتيب سيكون هو الترتيب السابق بالإضافة إلى الأرقام المكررة. لذلك، لا تقوم هذه الوظيفة دائمًا بتعيين ترتيب الصفوف بترتيب متتابع.
تعد الدالة RANK أيضًا جزءًا فرعيًا من وظائف النافذة. يجب تذكر النقاط التالية أثناء استخدام هذه الوظيفة :
- يعمل دائمًا مع جملة OVER ().
- يقوم بتعيين رتبة لكل صف بناءً على جملة ORDER BY.
- يقوم بتعيين رتبة لكل صف بالترتيب المتتالي.
- يقوم دائمًا بتعيين رتبة للصفوف، بدءًا برتبة واحدة لكل قسم جديد.
ملاحظة: يقوم الترتيب بتعيين قيم مؤقتة للصفوف الموجودة داخل القسم عند تنفيذ الاستعلام.
يوفر SQL Server وظائف الترتيب التالية :
- رتبة()
- رقم الصف()
- DENSE_RANK()
- نتيل()
دعونا نتعلم كل وظيفة رتبة بالتفصيل. أولاً، سنقوم بإنشاء جدول لتوضيح كل هذه الوظائف. العبارات التالية تنشئ جدولاً باسم rank_demo مع ثلاثة أعمدة:
CREATE TABLE rank_demo ( first_name VARCHAR(60), last_name VARCHAR(40), city VARCHAR(30) );
بعد ذلك، سوف نقوم بإدراج بعض الصفوف في هذا الجدول على النحو التالي:
INSERT INTO rank_demo (first_name, last_name, city) VALUES ('Luisa', 'Evans', 'Texas'), ('Paul', 'Ward', 'Alaska'), ('Peter', 'Bennett', 'California'), ('Carlos', 'Patterson', 'New York'), ('Rose', 'Huges', 'Florida'), ('Marielia', 'Simmons', 'Texas'), ('Antonio', 'Butler', 'New York'), ('Diego', 'Cox', 'California');
يمكننا التحقق من الجدول باستخدام عبارة SELECT. يعرض الإخراج أدناه:
اختيار الفرز جافا
وظيفة RANK()
تُستخدم هذه الوظيفة لتحديد تصنيف كل صف في مجموعة النتائج. يوضح بناء الجملة التالي استخدام الدالة RANK في SQL Server:
أنكيتا ديف
SELECT column_name RANK() OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'my_rank' FROM table_name;
في بناء الجملة هذا،
- ال جملة 'OVER'. يضبط تقسيم النتيجة وترتيبها قبل تطبيق وظيفة النافذة المرتبطة.
- ال القسم حسب الجملة يقسم الإخراج الناتج عن جملة FROM إلى القسم. ثم يتم تطبيق الوظيفة على كل قسم وإعادة تهيئتها عندما تتقاطع حدود التقسيم مع الأقسام. إذا لم نحدد هذه الجملة، فستعامل الدالة جميع الصفوف كقسم واحد.
- ال ترتيب حسب عبارة عن جملة مطلوبة تحدد ترتيب الصفوف بطريقة تنازلية أو تصاعدية بناءً على اسم عمود واحد أو أكثر قبل تطبيق الوظيفة.
مثال
دعونا نرى كيف تعمل الدالة RANK() في SQL Server. ستستخدم العبارة التالية دالة التصنيف لتعيين ترقيم لكل صف:
SELECT first_name, last_name, city, RANK () OVER (ORDER BY city) AS Rank_No FROM rank_demo;
وبما أننا لم نستخدم القسم حسب الجملة ، تعامل الدالة النتيجة بأكملها كقسم واحد. سيؤدي تنفيذ البيان إلى عرض الإخراج أدناه:
في هذا الإخراج، يمكننا أن نرى أن بعض الصفوف تحصل على نفس المرتبة لأنها لها نفس القيمة في عمود المدينة . وسيكون الرقم التالي في الترتيب هو رتبته السابقة بالإضافة إلى عدد من الأرقام المكررة.
البيان التالي هو مثال آخر حيث سنستخدم قسمًا حسب الجملة التي ستقسم الصفوف بناءً على مدينة العمود وتعيين تصنيف لكل صف داخل القسم. ويستند ترتيب الإخراج على الاسم الأول :
SELECT first_name, last_name, city, RANK () OVER (PARTITION BY city ORDER BY first_name) AS Rank_No FROM rank_demo;
سيعرض الإخراج أدناه:
الدالة ROW_NUMBER()
يتم استخدام هذه الوظيفة ل إرجاع الرقم التسلسلي الفريد لكل صف داخل قسمها. يبدأ ترقيم الصفوف من رقم واحد ويزداد بمقدار واحد حتى يتم الوصول إلى العدد الإجمالي لصفوف القسم. سيُرجع الرتب المختلفة للصف الذي يحتوي على قيم مماثلة تجعله مختلفًا عن الدالة RANK().
يوضح بناء الجملة أدناه استخدام الدالة ROW_NUMBER() في SQL Server:
التحكم في البرنامج المخزن
SELECT column_name ROW_NUMBER() OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'rank_name' FROM table_name;
مثال
قم بتنفيذ الاستعلام التالي لتعيين رقم تسلسلي لكل صف:
SELECT first_name, last_name, city, ROW_NUMBER() OVER(ORDER BY city) AS my_rank FROM rank_demo;
سيتم تعيين الترتيب للجدول وفقا لهم مدينة . هنا يمكننا أن نرى أنه يعين رتبًا مختلفة للصف الذي له نفس قيم المدينة.
إذا قمنا بتغيير ترتيب الفرز من صاعداً إلى نازل باستخدام جملة ORDER BY، ستقوم هذه الدالة أيضًا بتغيير الترتيب وفقًا لذلك. انظر البيان أدناه:
SELECT first_name, last_name, city, ROW_NUMBER() OVER(ORDER BY city DESC) AS my_rank FROM rank_demo;
وهنا النتيجة:
دالة DENSE_RANK()
يتم تعيين هذه الوظيفة رتبة فريدة لكل صف داخل القسم حسب قيمة العمود المحدد دون أي فجوات. ويحدد دائمًا الترتيب بالترتيب المتتالي. إذا حصلنا على قيمة مكررة ، ستقوم هذه الوظيفة بتخصيصها بنفس المرتبة، وتكون المرتبة التالية هي الرقم التسلسلي التالي. تختلف هذه الخاصية عن الدالة DENSE_RANK() عن الدالة RANK().
الحشو المغلق
يوضح بناء الجملة أدناه استخدام دالة DENSE_RANK() في SQL Server:
SELECT column_name DENSE_RANK() OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'rank_name' FROM table_name;
مثال
يستخدم الاستعلام التالي الدالة DENSE_RANK() لتعيين رقم تصنيف لكل صف:
SELECT first_name, last_name, city, DENSE_RANK() OVER(ORDER BY city) AS my_rank FROM rank_demo;
سيعيد الناتج أدناه حيث يمكننا أن نرى أن القيم المكررة لها نفس المرتبة، وستكون المرتبة التالية هي الرقم التسلسلي التالي.
إنه مثال آخر للدالة DENSE_RANK() باستخدام جملة PARTITION BY. ستقسم هذه الجملة الصفوف بناءً على عمود المدينة، ويعتمد ترتيب مجموعة النتائج على الاسم الأول:
SELECT first_name, last_name, city, DENSE_RANK() OVER(PARTITION BY city ORDER BY first_name) AS my_rank FROM rank_demo;
سنحصل على الناتج أدناه لأنه لا يوجد اسمان متماثلان. في هذه الحالة، يكون الإخراج مشابهًا للدالة RANK().
لنقم بتحديث الاسم بالاستعلام التالي:
أين إعدادات المتصفح
Update rank_demo set first_name = 'Diego' WHERE city = 'California'
الآن قم بتنفيذ نفس الاستعلام مرة أخرى. سنرى أن هذا الجدول حصل على نفس الاسم مدينة كاليفورنيا . ولذلك، فإن الرتبة هي نفسها أيضًا لكلا الاسمين.
وظيفة نتيل (ن).
يتم استخدام هذه الوظيفة ل توزيع صفوف القسم المرتب إلى رقم محدد مسبقًا (ن) من مجموعات متساوية تقريبا. تحصل كل مجموعة صفوف على رتبتها بناءً على الشرط المحدد وتبدأ بالترقيم من مجموعة واحدة. ويعين أ رقم دلو لكل صف في مجموعة تمثل المجموعة التي ينتمي إليها.
يوضح بناء الجملة التالي استخدام دالة NTILE() في SQL Server:
SELECT column_name NTILE(N) OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'my_rank' FROM table_name;
مثال
يستخدم الاستعلام التالي الدالة NTILE() لتعيين رقم تصنيف لكل صف:
SELECT first_name, last_name, city, NTILE(3) OVER(ORDER BY city) AS my_rank FROM rank_demo;
الجدول المحدد لديه ثمانية سجلات . لذلك، نتيل(3) يخبرنا أن مجموعة النتائج يجب أن تحتوي على مجموعة من ثلاثة سجلات . سيؤدي تنفيذ البيان إلى عرض الإخراج أدناه:
تشرح هذه المقالة جميع وظائف RANK المستخدمة في SQL Server مع أمثلة متنوعة. كما يوضح الاختلافات الرئيسية بين هذه الوظائف. تعتبر هذه الوظائف مفيدة جدًا للمطورين لاستكشاف بياناتهم وإدارتها بشكل جيد.