بررسی ()Row_number در SQL SERVER
()Row_Number :
این تابع برای هر ردیف یک عدد منحصر بفرد را بر می گرداند ، عدد انتساب داده شده به صورت ترتیبی به هر رکورد انتساب داده می شود که از یک شروع شده و به تعداد رکورد های برگردانده شده افزایش می یابد .
ساختار دستور این دستور به صورت زیر می باشد :
1 2 |
ROW_NUMBER ( ) OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause ) |
استفاده از Partition اختیاری می باشد اما به کاربردن Order by الزامی می باشد .
. برای درک بهتر ابتدا کوئری زیر را اجرا کنید :
1 2 3 4 5 6 7 8 9 10 11 |
declare @users Table ( name varchar(10), Age int , RoleId int ) insert into @users values('osman',23,1) insert into @users values('ramin',30,2) insert into @users values('saman',13,1) insert into @users values('ali',18,3) select * from @users |
اگر کوئری فوق را اجرا کنیم نتیجه ای زیر را می بینیم :
حال دستور select را به صورت زیر تغییر می دهیم :
1 2 3 |
select *, ROW_NUMBER() over (order by age) as Row from @users |
و خروجی به صورت زیر تغییر خواهد کرد :
همانطور که مشاهده می کنید در دستور Row_Number از Partition استفاده نکرده ایم . نوشتن دستور Row_Number در دستور فوق باعث شد تا به هر ردیف یک عدد ترتیبی نسبت دهد . چون در قسمت Order by بر اساس Age گذاشته بودیم ، ابتدا بر اساس Age به صورت صعودی مرتب می کند و بعد اعداد ترتیبی را به هر ردیف نسبت می دهد .
اگر در دستور Row_Number از Parition هم به صورت زیر استفاده کنیم :
1 2 3 |
select *, ROW_NUMBER() over ( partition by roleid order by age) as Row from @users |
نتیجه حاصل به صورت زیر خواهد بود :
استفاده از Partition باعث می شود ابتدا یک گروه بندی بر اساس ردیف مورد نظر انجام شود و بعد برای هر گروه شمارش ترتیبی را نسبت می دهد . مثلا برای RoleId با مقدار 1 چون دو ردیف وجود داشت ،هر دو رکورد در یک گروه در نظر گرفته و اعداد ترتیبی را به آنها نسبت می دهد .
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.