()Row_Number :
این تابع برای هر ردیف یک عدد منحصر بفرد را بر می گرداند ، عدد انتساب داده شده به صورت ترتیبی به هر رکورد انتساب داده می شود که از یک شروع شده و به تعداد رکورد های برگردانده شده افزایش می یابد .
ساختار دستور این دستور به صورت زیر می باشد :
ROW_NUMBER ( )
OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
استفاده از Partition اختیاری می باشد اما به کاربردن Order by الزامی می باشد .
. برای درک بهتر ابتدا کوئری زیر را اجرا کنید :
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 را به صورت زیر تغییر می دهیم :
select *,
ROW_NUMBER() over (order by age) as Row
from @users
و خروجی به صورت زیر تغییر خواهد کرد :

همانطور که مشاهده می کنید در دستور Row_Number از Partition استفاده نکرده ایم . نوشتن دستور Row_Number در دستور فوق باعث شد تا به هر ردیف یک عدد ترتیبی نسبت دهد . چون در قسمت Order by بر اساس Age گذاشته بودیم ، ابتدا بر اساس Age به صورت صعودی مرتب می کند و بعد اعداد ترتیبی را به هر ردیف نسبت می دهد .
اگر در دستور Row_Number از Parition هم به صورت زیر استفاده کنیم :
select *,
ROW_NUMBER() over ( partition by roleid order by age) as Row
from @users
نتیجه حاصل به صورت زیر خواهد بود :

استفاده از Partition باعث می شود ابتدا یک گروه بندی بر اساس ردیف مورد نظر انجام شود و بعد برای هر گروه شمارش ترتیبی را نسبت می دهد . مثلا برای RoleId با مقدار 1 چون دو ردیف وجود داشت ،هر دو رکورد در یک گروه در نظر گرفته و اعداد ترتیبی را به آنها نسبت می دهد .
نظر شما برای ما مهم است و به ما در بهبود سایت کمک میکند.