تابع پنجره ای RANK در SQL: توضیح جامع با مثال
مقدمه
توابع پنجره ای در SQL به شما امکان می دهند محاسبات را بر روی گروه های متوالی یا زیرمجموعه های ردیف های جداول انجام دهید. این توابع قدرتمندی هستند که می توانند برای انجام انواع مختلف وظایف تحلیلی، مانند رتبه بندی، جمع آوری و فیلتر کردن داده ها استفاده شوند.
یکی از توابع پنجره ای رایج RANK() است. این تابع به هر ردیف در یک پارتیشن رتبه ای اختصاص می دهد. رتبه ها بر اساس مقادیر در یک یا چند ستون مرتب سازی می شوند. اگر دو یا چند ردیف مقادیر یکسانی در ستون های مرتب سازی داشته باشند، به آنها رتبه یکسان اختصاص داده می شود.
سینتکس
سینتکس کلی تابع RANK() به شرح زیر است:
RANK() OVER (PARTITION BY partition_expression ORDER BY order_expression)
در کجا:
partition_expressionعبارتی است که ردیف ها را به پارتیشن ها تقسیم می کند.order_expressionعبارتی است که ردیف ها را در هر پارتیشن مرتب سازی می کند.
اگر partition_expression مشخص نشده باشد، تمام ردیف ها در یک پارتیشن واحد قرار می گیرند. اگر order_expression مشخص نشده باشد، ردیف ها به ترتیب صعودی بر اساس اولین ستون در عبارت SELECT مرتب می شوند.
مثال
فرض کنید جدولی به نام customers داریم که حاوی ستون های customer_id، last_name و order_amount است. می خواهیم رتبه هر مشتری را بر اساس order_amount به ترتیب نزولی بدست آوریم. می توانیم از کوئری زیر برای انجام این کار استفاده کنیم:
SELECT customer_id, last_name, order_amount,
RANK() OVER (ORDER BY order_amount DESC) AS customer_rank
FROM customers;
این کوئری نتیجه زیر را برمی گرداند:
customer_id | last_name | order_amount | customer_rank
-----------+-----------+-------------+-------------
1 | Johnson | 1500.00 | 1
2 | Williams | 1200.00 | 2
3 | Brown | 1100.00 | 3
4 | Miller | 1000.00 | 4
5 | Davis | 900.00 | 5
همانطور که مشاهده می کنید، به هر مشتری با بالاترین سفارش، رتبه 1 اختصاص داده می شود و به مشتری با کمترین سفارش، رتبه 5 اختصاص داده می شود.
نکات
- تابع
RANK()می تواند ناتعیین کننده باشد، به این معنی که نتایج آن می تواند بسته به ترتیب اجرای کوئری متفاوت باشد. اگر به نتایج قابل تکرار نیاز دارید، باید از تابع پنجره ای دیگری مانندDENSE_RANK()استفاده کنید. - تابع
RANK()می تواند برای اختصاص رتبه های غیرتکراری به ردیف ها با مقادیر یکسان استفاده شود. برای انجام این کار، می توانید از عبارتDENSE_RANK()به جایRANK()استفاده کنید. - تابع
RANK()می تواند برای اختصاص رتبه ها به ردیف ها در یک زیرمجموعه انتخابی از ردیف ها استفاده شود. برای انجام این کار، می توانید از عبارتWHEREدر داخل عبارتOVERاستفاده کنید.
منابع
- Overview of SQL RANK functions – SQLShack
- SQL RANK() Function Explained By Practical Examples
- Ranking Functions (Transact-SQL) – SQL Server – Microsoft Learn
نتیجه
تابع RANK() یک تابع پنجره ای قدرتمند در SQL است که می تواند برای رتبه بندی ردیف ها بر اساس مقادیر در یک یا چند ستون استفاده شود. این تابع برای انواع مختلف وظایف تحلیلی، مانند ردیابی عملکرد، شناسایی مشتریان برتر و تجزیه و تحلیل روندها مفید است.



