PDA

View Full Version : بدست اوردن موقعیت رکوردی با استفاده از یک فیلد خاص



M.YasPro
یک شنبه 14 شهریور 1389, 13:34 عصر
سلام
من میخوام بعد از یه پرس و جو از جدول مثلا پرسون ، بتونم بفهمم که مثلا یک رکورد خاص با id مشخص در ردیف چندم قرار داره

ممنون از توجهتون

pezhvakco
یک شنبه 14 شهریور 1389, 13:39 عصر
اگه اشاره گر جدول رو به اون ردیف انتقال بدی ، می تونی از این کد دستور استفاده کنی :

Table1.RecNo

pezhvakco
یک شنبه 14 شهریور 1389, 15:05 عصر
یک رکورد خاص با id مشخص در ردیف چندم قرار دارهاون کد دستوری که نوشتم ، شماره ردیف جاری در بانک اطلاعاتی رو میده .

اگه شما در هنگام جستجو، اشاره گر جدول و به همون ردیفی که شرط لازم رو داره انتقال بدی، بعد با اون کد دستو میتونی شماره ردیف رو بدست بیاری .

Table1.Locate('ID','1',[]);
Rc_Num:=Table1.RecNo;

M.YasPro
یک شنبه 14 شهریور 1389, 15:17 عصر
اگر بخوام با دستور شما رو توی خروجی یک select استفاده کنم به چه صورت میشه ؟

ali_zzr
یک شنبه 14 شهریور 1389, 15:52 عصر
این صفحه رو ببین . راجع به استفاده از تابع Row_numbert() هست.
مثال دومش به درد شما میخوره :

http://msdn.microsoft.com/en-us/library/ms186734.aspx

M.YasPro
یک شنبه 14 شهریور 1389, 16:18 عصر
مرسی
به دردم خورد
اما این تابع لیستی از rowNumber ها رو بهم میده .
فرض کنید من یه جدول کارمندان دارم که یه فیلد امتیاز دارند ، حالا می خوام یه جایی Id این کارمند رو بدم و رتبه ش رو توی این لیست متوجه بشم یعنی بگم این کارمند توی تمام کارمندها از نظر عملکرد رتبه nام رو داره .

majidrajab
دوشنبه 15 شهریور 1389, 09:21 صبح
با استفاده از تابع Row_number() مي توانيد ركورد ها را رتبه بندي نمود و با استفاده از select رتبه مورد نظر را بدست آورد
select row-number() over(order by
فيلد مورد نظر ) as ti, *
from جدول
select t1 رتبه فرد مورد نظر را نمايش مي دهد

ali_zzr
دوشنبه 15 شهریور 1389, 10:54 صبح
مرسی
به دردم خورد
اما این تابع لیستی از rowNumber ها رو بهم میده .
فرض کنید من یه جدول کارمندان دارم که یه فیلد امتیاز دارند ، حالا می خوام یه جایی Id این کارمند رو بدم و رتبه ش رو توی این لیست متوجه بشم یعنی بگم این کارمند توی تمام کارمندها از نظر عملکرد رتبه nام رو داره .

این تابع یک فیلد شماره سطر به دستور Select شما اضافه میکنه. حالا شما میتونی هر جور بخواهی دستور Select اصلی خودتو order کنی.
اونوقت شماره سطر بر اساس مرتب سازی شما به شما داده میشود

بهزادصادقی
دوشنبه 15 شهریور 1389, 22:51 عصر
سلام
من میخوام بعد از یه پرس و جو از جدول مثلا پرسون ، بتونم بفهمم که مثلا یک رکورد خاص با id مشخص در ردیف چندم قرار داره

ممنون از توجهتون

من خوشحال می شوم کمک تون کنم. ولی یک مقدار اطلاعات بیشتر نیاز دارم تا بتونم یک query بنویسم که انشالله به سادگی قابل فهم و دسترسی برای شما باشد. می شود خواهش کنم ساختار جدول مورد نظر خویش را درج نموده و توضیج دهید که وقتی در مورد "ردیف" صحبت می نمائید، منظورتان ردیف بر اساس چه ترتیبی می باشد؟

اگر چند تا داده نمونه در یک جدول به من بدید، و بعد به صورت مثال نشان دهید چگونه یک سطر خاص در آن چدول باید ردیف بپذیرد خیلی متشکر خواهم شد.

M.YasPro
سه شنبه 16 شهریور 1389, 15:59 عصر
ممنون از جوابتون

جدول emploee

id
name
.
.
score

حالا من می خوام یه id بهش بدم و رتبه اون id رو توی کوئری


select * from empolee order by score

بدست بیارم
حالا مهم اینه که میخوام کوئری حاصل فقط یک عدد برگردونه نه یه سری رکورد که خودم برم از توی اون موقعیت رکورد مورد نظر رو پیدا کنم
به زبون ساده می خوام رتبه کارمندم رو بر اساس score استخراج کنم .

بهزادصادقی
سه شنبه 16 شهریور 1389, 22:35 عصر
ببین آیا این کد آن کاری را که شما می خواهید انجام می دهد یا نه؟

فرض کن دو نفر وجود دارند که score شان یکی است. در آن صورت ردیف آن دو نفر را چه جوری باید محاسبه کرد؟

کد زیر سه راه متفاوت استاندارد را برای آن ارائه می کند.

اگر هر سوالی داشتید، در خدمت تان هستم.



if object_id( 'dbo.Employee' ) is not null
drop table dbo.Employee;
go

create table dbo.Employee
(
id int identity(1,1) primary key,
FirstName nvarchar(100),
LastName nvarchar(100),
Score int
);

insert dbo.Employee (FirstName, LastName, Score ) values ( N'Narima', N'Sabet', 24 );
insert dbo.Employee (FirstName, LastName, Score ) values ( N'Behzad', N'Sadeghi', 47 );
insert dbo.Employee (FirstName, LastName, Score ) values ( N'Maysam', N'Bidabadi', 32 );
insert dbo.Employee (FirstName, LastName, Score ) values ( N'Shadi', N'Paridar', 6 );
insert dbo.Employee (FirstName, LastName, Score ) values ( N'Mehri', N'Jeyhoon', 15 );
insert dbo.Employee (FirstName, LastName, Score ) values ( N'Ziba', N'Bikalam', 53 );
insert dbo.Employee (FirstName, LastName, Score ) values ( N'Saba', N'Ettehad', 15 );

select
row_number() over( order by e.Score desc ) RowLevelRank,
dense_rank() over( order by e.Score desc ) DenseRank,
rank() over( order by e.Score desc ) NonDenseRank,
e.*
from
dbo.Employee e
order by
e.Score desc;


شما باید بتوانید این کد را همان طور که هست در SQL Server Management Studio اجرا کنید.

M.YasPro
چهارشنبه 17 شهریور 1389, 09:58 صبح
تابع dense_rank جواب من هست . ولی این تابع زمان استخراج کردن اطلاعات جواب میده و بر اساس سطرهاست ، یعنی اینجوری نمیشه بکارش گرفت :


select
dense_rank() over( order by e.Score desc ) DenseRank
from
dbo.Employee e
where id=10
order by
e.Score desc;



هیچ راه دیگه ای نداره ؟

بهزادصادقی
چهارشنبه 17 شهریور 1389, 22:44 عصر
نگاه کن، وقتی شما می خواهید رتبه یک چیزی را محاسبه کنی، همیشه لازم است که آن رتبه را در رابطه با به یک شاخص خاص محاسبه کنی. مثلا، رتبه آدمها را در رابطه با شاخص سن آدم ها. یا رتبه یک دانش آموز را در رابطه با نمری وی در آخرین امتحان. درسته؟

خوب، اگر این داده ها توی یک دیتا بیس هستند، این سوال پیش می آید. آیا این شاخص ها، مثلا سن آدم ها یا نمره دانش آموز در آخرین امتحان، قابل تغییر در طی زمان می باشند و یا خیر؟

اگر این داده ها هیج وقت تغییر نمی کنند، شما می توانید توی هر کدام از جداولتان که می خواهی با سطر های آن یک رتبه بدهی، یک ستون به اسم رتبه اضافه کنی، رتبه همه را یک بار محاسبه کنی، رتبه هر کس را در ستون رتبه سطر خود وارد کنی، تا بعد هر وقت رتبه کسی را لازم داری، فقط لازم داشته باشی سطر حاوی اطلاعات آنها را از جدول خویش بخوانی و رتبه شان را ببینی.

ولی اگر داده های شاخص مربوط به رتبه همواره در حال تغییر هستند، آن وقت اینکه رتبه یک فرد خاص چه می باشد بستگی دارد به اینکه شما کی تقاضای رتبه بندی افراد را می کن. امروز صبح ساعت 6 وقتی من از خواب بیدار شدم، رتبه من در بین ساکنان مجتمع مسکونی ما از نظر وزن خود، خیلی پائین بود. ولی امشب وقتی از شام برگشتم، مطمتن هستم رتبه ام رسیده بود به شماره 1.

این تابع های بالا برای حل مسائلی از این نوع دوم ساخته شده اند. برای همین است که شما اول باید یک سری سطر را از طریق یک دستور select انتخاب کنی، و بعد یک شاخص برای رتبه بندی تعیین کنی تا SQL Server همه سطر های شما را بر اساس آن شاخص رتبه بندی کند.