DENSE_RANK در SQL: توضیح جامع با مثال
DENSE_RANK یک تابع پنجره در SQL است که برای رتبه بندی ردیف ها در یک مجموعه نتایج بر اساس یک ستون خاص استفاده می شود. این تابع با اختصاص رتبه های متوالی به ردیف ها، بدون هیچ گونه شکاف در رتبه ها، با تابع RANK() تفاوت دارد. به عبارت دیگر، DENSE_RANK** به ردیف هایی که مقادیر یکسانی دارند، رتبه یکسانی اختصاص می دهد**، در حالی که RANK() ممکن است در این شرایط رتبه ها را پرش دهد.
نحو:
SQL
DENSE_RANK()
OVER (
PARTITION BY ستون_پارتیشن
ORDER BY ستون_ترتیب
)
- PARTITION BY: این بخش مجموعه نتایج را به پارتیشن های مجزا تقسیم می کند. رتبه بندی در هر پارتیشن به طور جداگانه انجام می شود.
- ORDER BY: این بخش ترتیب ردیف ها را در هر پارتیشن تعیین می کند. رتبه ها بر اساس این ترتیب اختصاص داده می شوند.
مثال:
فرض کنید جدولی به نام sales
داریم که شامل ستون های customer_id
، product_id
و quantity
است. می خواهیم رتبه هر محصول را برای هر مشتری بر اساس مقدار فروش (quantity) بدست آوریم.
SQL
SELECT
customer_id,
product_id,
quantity,
DENSE_RANK() OVER (
PARTITION BY customer_id
ORDER BY quantity DESC
) AS product_rank
FROM sales;
در این مثال، نتایج به شرح زیر خواهد بود:
customer_id | product_id | quantity | product_rank |
---|---|---|---|
۱ | ۱۰۱ | ۱۰۰ | ۱ |
۱ | ۱۰۲ | ۵۰ | ۲ |
۱ | ۱۰۳ | ۲۵ | ۳ |
۲ | ۲۰۱ | ۷۵ | ۱ |
۲ | ۲۰۲ | ۲۵ | ۲ |
۲ | ۲۰۳ | ۲۵ | ۲ |
همانطور که مشاهده می شود، محصولاتی که مقدار فروش یکسانی دارند، رتبه یکسانی را دریافت می کنند.
نکات:
- DENSE_RANK() می تواند برای رتبه بندی ردیف ها در سناریوهای مختلف، مانند شناسایی مشتریان برتر یا محصولات پرفروش، مفید باشد.
- DENSE_RANK() را می توان با سایر توابع پنجره مانند
FIRST_VALUE()
یاLAST_VALUE()
برای تجزیه و تحلیل بیشتر داده ها ترکیب کرد. - برای اطلاعات بیشتر در مورد توابع پنجره در SQL، به مستندات مربوط به سیستم مدیریت پایگاه داده خود مراجعه کنید.
منابع:
- https://mariadb.com/kb/en/dense_rank/
- https://www.youtube.com/watch?v=MZzFggYn-SA
- https://docs.getdbt.com/sql-reference/rank