دستور العمل SQL: رکوردهای رتبه بندی – انجمن DEV

فرض کنید می خواهیم یک رتبه بندی ایجاد کنیم، جایی که موقعیت هر رکورد با مقدار یک یا چند ستون تعیین می شود.
راه حل استفاده از rank()
عملکرد بر روی یک پنجره SQL که توسط ستون های هدف مرتب شده است.
مثال
بیایید رتبه بندی کنیم employees
بر اساس حقوق:
select
rank() over w as "rank",
name, department, salary
from employees
window w as (order by salary desc)
order by "rank", id;
┌──────┬───────┬────────────┬────────┐
│ rank │ name │ department │ salary │
├──────┼───────┼────────────┼────────┤
│ 1 │ Frank │ it │ 120 │
│ 2 │ Henry │ it │ 104 │
│ 2 │ Irene │ it │ 104 │
│ 4 │ Alice │ sales │ 100 │
│ 5 │ Cindy │ sales │ 96 │
│ 5 │ Dave │ sales │ 96 │
│ 7 │ Grace │ it │ 90 │
│ 8 │ Emma │ it │ 84 │
│ 9 │ Bob │ hr │ 78 │
│ 10 │ Diane │ hr │ 70 │
└──────┴───────┴────────────┴────────┘
این rank()
عملکرد به هر کارمند با توجه به حقوق آنها رتبه ای اختصاص می دهد (order by salary desc
). توجه داشته باشید که کارمندان با حقوق یکسان رتبه یکسانی دریافت می کنند (هنری و ایرنه، سیندی و دیو).
جایگزین، گزینه ها
ما میتوانیم استفاده کنیم dense_rank()
بجای rank()
برای جلوگیری از “شکاف” در رتبه بندی:
select
dense_rank() over w as "rank",
name, department, salary
from employees
window w as (order by salary desc)
order by "rank", id;
┌──────┬───────┬────────────┬────────┐
│ rank │ name │ department │ salary │
├──────┼───────┼────────────┼────────┤
│ 1 │ Frank │ it │ 120 │
│ 2 │ Henry │ it │ 104 │
│ 2 │ Irene │ it │ 104 │
│ 3 │ Alice │ sales │ 100 │
│ 4 │ Cindy │ sales │ 96 │
│ 4 │ Dave │ sales │ 96 │
│ 5 │ Grace │ it │ 90 │
│ 6 │ Emma │ it │ 84 │
│ 7 │ Bob │ hr │ 78 │
│ 8 │ Diane │ hr │ 70 │
└──────┴───────┴────────────┴────────┘
توجه داشته باشید که آلیس در رتبه 3 و گریس در رتبه 5 قرار دارد، در حالی که قبلا آنها به ترتیب در رتبه های 4 و 7 قرار داشتند.
سازگاری
همه فروشندگان عمده پشتیبانی می کنند rank()
و dense_rank()
توابع پنجره برخی از آنها، مانند MS SQL و Oracle، پشتیبانی نمی کنند window
عبارت. در این موارد، میتوانیم تعریف پنجره را درون خطی کنیم:
select
rank() over (
order by salary desc
) as "rank",
name, department, salary
from employees
order by "rank", id;
آیا می خواهید در مورد عملکردهای پنجره بیشتر بدانید؟ کتاب من را بخوانید – توابع پنجره SQL توضیح داده شده است
دنبال کردن @ohmypy در توییتر برای پیگیری پست های جدید