برنامه نویسی

دستور العمل 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 در توییتر برای پیگیری پست های جدید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا