تابع پنجره ای 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
-----------+-----------+-------------+-------------
۱ | Johnson | 1500.00 | 1
۲ | Williams | 1200.00 | 2
۳ | Brown | 1100.00 | 3
۴ | Miller | 1000.00 | 4
۵ | Davis | 900.00 | 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 است که می تواند برای رتبه بندی ردیف ها بر اساس مقادیر در یک یا چند ستون استفاده شود. این تابع برای انواع مختلف وظایف تحلیلی، مانند ردیابی عملکرد، شناسایی مشتریان برتر و تجزیه و تحلیل روندها مفید است.