X
تبلیغات

بررسی ()Row_number در SQL SERVER

این تابع برای هر ردیف یک عدد منحصر بفرد را بر می گرداند ، عدد انتساب داده شده به صورت ترتیبی به هر رکورد انتساب داده می شود که از یک شروع شده و به تعداد رکورد های برگردانده شده افزایش می یابد  .

جدول زیر را در نظر بگیرید :


Split-in-SQlServer

قصدا داریم مقدار ستون Title را که دارای کاما می باشد به چندین رکورد تقسیم کنیم ، یعنی هر عدد در یک رکورد مجزا قرار بگیرد ، برای اینکار می توانیم از کوئری زیر استفاده کنیم :

SELECT
     Split.a.value('.', 'VARCHAR(100)') AS Result  
 FROM  (SELECT Title,  
         CAST ('' + REPLACE(Title, ',', '') + '' AS XML) AS String  
     FROM  mytable where id=1) AS A CROSS APPLY String.nodes ('/M') AS Split(a);  
    

بعد از اجرای کوئری فوق نتیجه حاصل به صورت زیر خواهد بود :

comma separated



استفاده از 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

 اگر کوئری فوق را اجرا کنیم نتیجه ای زیر را می بینیم :

Sql query

حال دستور select را به صورت زیر تغییر می دهیم :

select *,
ROW_NUMBER() over (order by age) as Row
 from @users

و خروجی به صورت زیر تغییر خواهد کرد :

Sql query

همانطور که مشاهده می کنید در دستور 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

 نتیجه حاصل به صورت زیر خواهد بود :

Row_Number

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

ادامه مطلب

+ تعداد بازدید : ۳۱ |
نوشته شده توسط alisaadat در دوشنبه ۱۶ بهمن ۱۳۹۶ و ساعت ۱۹:۲۷
ارسال نظر
نام شما :
آدرس وب سایت :
پست الکترونیک :
پیام شما :
کد امنیتی :