PDA

View Full Version : نشان دادت یکی از فیلد های تکرار



karimi.ali2005
چهارشنبه 18 اسفند 1389, 22:14 عصر
من یک جدول به شکل زیر دارم میخوام یکی از رکوردها با id برابر1 یکی از رکوردها با id برابر 2 و....
یعنی یه جواریی یه چیزی شبیه distinct اما روی یک فیلد
مرسی

67296

mehdi58
پنج شنبه 19 اسفند 1389, 11:37 صبح
من یک جدول به شکل زیر دارم میخوام یکی از رکوردها با id برابر1 یکی از رکوردها با id برابر 2 و....
یعنی یه جواریی یه چیزی شبیه distinct اما روی یک فیلد
مرسی

67296

من هنوز هم به درستي متوجه سوال شما نشده ام .
آيا شما مي خواهيد در خروجي هر دو فيلد ID و Names را داشته باشيد و اصلا مقدار فيلد Names برايتان مهم نيست ؟
اگر پاسخ سوال من مثبت باشد با استفاده از TOP 1 در SELECT مشكلتان حل مي شود اما در غير اينصورت بهتر است منظورتان را دقيقتر بيان كنيد .

karimi.ali2005
پنج شنبه 19 اسفند 1389, 13:17 عصر
با استفاده از top 1 فقط فیلد 1==>ali نمایش داده میشودمن میخوام همین جدول به طور مثال رکوردهای زیر نمایش داده شود
1==>ali
2==>taghi
3==>naser
نکته :البته همان طور که گفتم فرقی نمیکنه کدامیک از رکوردهای فیلد id برابر 1 نشان داده شود مثلا میشه 1==>mohammad,....

mehdi58
سه شنبه 24 اسفند 1389, 13:02 عصر
با استفاده از top 1 فقط فیلد 1==>ali نمایش داده میشودمن میخوام همین جدول به طور مثال رکوردهای زیر نمایش داده شود
1==>ali
2==>taghi
3==>naser
نکته :البته همان طور که گفتم فرقی نمیکنه کدامیک از رکوردهای فیلد id برابر 1 نشان داده شود مثلا میشه 1==>mohammad,....

مشكل شما به راحتي و با يك Groupby بر روي فيلد id حل خواهد شد.

karimi.ali2005
سه شنبه 24 اسفند 1389, 16:02 عصر
ممنون دوست عزیز
استادم هم این روش را پیشنهاد داد کدش هم به صورت زیر است



SELECT id,(SELECTTOP 1 names FROM t1 t2 where t1.id=id)FROM t1

GROUP



BY id



اما چون من اینجا یه جدول کوچیک گذاشتم کار ساده ای اما اگر مثلا ده فیلد داشته باشه و ما خواسته باشیم از id جدول group by بگیریم نیاز به 10 تا Select داریم که فکر کنم روش جالبی نیست:متفکر:

Reza_Yarahmadi
سه شنبه 24 اسفند 1389, 20:36 عصر
اما چون من اینجا یه جدول کوچیک گذاشتم کار ساده ای اما اگر مثلا ده فیلد داشته باشه و ما خواسته باشیم از id جدول group by بگیریم نیاز به 10 تا Select داریم که فکر کنم روش جالبی نیست:متفکر:
در صورت استفاده از SQL Server 2005 به بالا میتونید از روش زیر استفاده کنید.
;With tbl as(
Select
Row_Number() Over(Order By Id) as Id_2,
*
From
TableName
), res as(
Select
Min(Id_2) as Id_2
From
tbl
Group By
ID
)
Select
T.*
From
tbl T Inner Join res
On
T.Id_2 = res.Id_2

karimi.ali2005
چهارشنبه 25 اسفند 1389, 22:34 عصر
این دستور را تا حالا کار نکردم فقط اینکه اینطور که متوجه شدم با این دستور می توان جدول مجازی درست کرد بله؟

karimi.ali2005
پنج شنبه 26 اسفند 1389, 14:26 عصر
نمیدونم چرا روی view جواب نمیده؟؟:متفکر:
همان view رو به جدول تبدیل کردم جواب داد!!!

Reza_Yarahmadi
پنج شنبه 26 اسفند 1389, 14:45 عصر
این دستور را تا حالا کار نکردم فقط اینکه اینطور که متوجه شدم با این دستور می توان جدول مجازی درست کرد بله؟
نمیشه اسمش رو جدول مجازی گذاشت ولی یکی از قابلیت های With اینه که میشه روی یک Select نام گذاشت در Selectهای بعدی از این Select با استفاده از نامیکه تعیین شده استفاده کرد. یکی دیگه از قابلیتهای اون اینه که میشه بصورت بازگشتی خودشو صدا کرد و یه جورایی بصورت تابع بازگشتی ازش استفاده کرد.

نمیدونم چرا روی view جواب نمیده؟؟:متفکر:
همان view رو به جدول تبدیل کردم جواب داد!!!
فرقی بین View و جدول وجود نداره (در این کد) علت مشکل جای دیگه ایه.

karimi.ali2005
شنبه 28 اسفند 1389, 10:41 صبح
من حدود 2 هفته دنبال یه روش جالب میگشتم

SELECT id,MAX(NAME) FROM t1
GROUP BY id

با توجه که select که من نوشته بودم و چند جدول رو join میکرد و تعداد فیلد بالا از لحاظ سرعت و سادگی خیلی بهتر از کدهای دیگر

محمد سلیم آبادی
جمعه 12 فروردین 1390, 10:27 صبح
در صورت استفاده از SQL Server 2005 به بالا میتونید از روش زیر استفاده کنید.
;With tbl as(
Select
Row_Number() Over(Order By Id) as Id_2,
*
From
TableName
), res as(
Select
Min(Id_2) as Id_2
From
tbl
Group By
ID
)
Select
T.*
From
tbl T Inner Join res
On
T.Id_2 = res.Id_2

سلام،
اگر از کلید واژه PARTITION استفاده بشه کوئری خیلی ساده تر و خوانا تر خواهد شد یعنی:


SELECT * FROM
(SELECT *, rnk = ROW_NUMBER() OVER(PARTITION BY id ORDER BY name) FROM table_name) AS D
WHERE rnk = 1;

محمد سلیم آبادی
جمعه 12 فروردین 1390, 10:31 صبح
من حدود 2 هفته دنبال یه روش جالب میگشتم

SELECT id,MAX(NAME) FROM t1
GROUP BY id

با توجه که select که من نوشته بودم و چند جدول رو join میکرد و تعداد فیلد بالا از لحاظ سرعت و سادگی خیلی بهتر از کدهای دیگر

اگر 5 ستون به غیر از ستون id داشته باشید آن وقت چطوری با توابع تجمعی مثل max می خواهید تنها یک سطر به ازای هر id بدست بیاورید؟
برای حل این موضوع باید به تکنیک ranking رجوع کنید.

karimi.ali2005
سه شنبه 16 فروردین 1390, 11:31 صبح
اگر 5 ستون به غیر از ستون id داشته باشید آن وقت چطوری با توابع تجمعی مثل max می خواهید تنها یک سطر به ازای هر id بدست بیاورید؟
برای حل این موضوع باید به تکنیک ranking رجوع کنید.
کافی برای همه max را بدست بیاریم درست میشه من استفاده کردم داخل برنامه

محمد سلیم آبادی
سه شنبه 16 فروردین 1390, 12:37 عصر
کافی برای همه max را بدست بیاریم درست میشه من استفاده کردم داخل برنامه

نه ظاهرا متوجه منظورم نشدید، به کد زیر توجه کنید. نتیجه مناسب شما با Correct Result و نتیجه اشتباه با Result نام گذاری شدند. که نتیجه حاصل از روش شما اشتباه خواهد بود. البته اگر نیاز شما اونی باشه که مد نظر من هست. ولی اگر تنها یک مقدر بطور نمونه برای هر فیلد به ازای هر گروه نیاز دارین همونی که گفتین جواب میده.


group_nbr col1 col2
--------------------------------------
1 25 5
1 20 8

SELECT group_nbr, MAX(col) AS co1, MAX(col2) AS col2
FROM TableName
GROUP BY group_nbr;
Result:
group_nbr col1 col2
--------------------------------------
1 25 8

Correct Result
group_nbr col1 col2
--------------------------------------
1 25 5