PDA

View Full Version : حذف رکورد های تکراری بر اساس فقط یک فیلد



majidrezaei2007
سه شنبه 17 مرداد 1391, 21:02 عصر
با عرض سلام خدمت اساتید گرامی

من یک جدول دارم و می خوام ازش یک کوئری بگیرم به این شکل که رکورد های تکراری رو حذف کنه (منظورم از حذف اینه که فقط یک نمونه از اوهنها بیاره) . منظورم از رکورد تکراری ، رکوردی هست که فقط یک فیلد از اونها تکراری باشه و نه همه فیلد ها . می خوام از کل سطر هایی که اون فیلدشون تکراریه فقط یک نمونه بیاره و مهم هم نیست کدومش باشه .
مثلا ساختاری جدول زیر رو در نظر بگیرید



1 12345 0 0 5
2 123456 0 1 4
3 12345 5 2 4
4 12345 0 3 0
5 12345 2 0 5

می خوام کل فیلد ها رو داشته باشم . مثلا اگه رکورد دوم اسمش lnumber باشه . می خوام از هر کدوم اون تو بانک فقط یکی بیاره به این شکل :

1 12345 0 0 5
2 123456 0 1 4


ممنون میشم راهنماییم کنید

ali_habibi1384
چهارشنبه 18 مرداد 1391, 00:43 صبح
اصلا مثال خوبي نبود! هيچيش معلوم نيست.
براي حذف تكراري ها از distinct استفاده كن.

majidrezaei2007
چهارشنبه 18 مرداد 1391, 02:35 صبح
اصلا مثال خوبي نبود! هيچيش معلوم نيست.
براي حذف تكراري ها از distinct استفاده كن.

distinct رو میدونم . اما دقت نکردید من چی گفتم . distinct میاد تکراری بودن رو بر اساس تمام فیلد ها در نظر میگیره . یعنی اگه تمام فیلد ها یکسان بودن اونارو حذف می کنه
ولی من می خوام که بر اساس یک فیلد در نظر بگیره . اگه اون تکراری بود فقط یک نمونشه بیاره

asadegha
چهارشنبه 18 مرداد 1391, 03:45 صبح
شما از همون distinct استفاده کن. فقط بجای اینکه موقع select کردن * بزاری و همه فیلدها رو انتخاب کنی، فقط همون فیلدی رو انتخاب کن که میخوای تکراری نباشه. یعنی اینطوری:

SELECT DISTINCT lnumber FROM Table1

ali_habibi1384
چهارشنبه 18 مرداد 1391, 08:35 صبح
distinct رو میدونم . اما دقت نکردید من چی گفتم . distinct میاد تکراری بودن رو بر اساس تمام فیلد ها در نظر میگیره . یعنی اگه تمام فیلد ها یکسان بودن اونارو حذف می کنه
ولی من می خوام که بر اساس یک فیلد در نظر بگیره . اگه اون تکراری بود فقط یک نمونشه بیاره
اينجوري كه نميشه عزيز من! فرض كن به sql گفتي از ده تا ركوردي كه نامش علي هست و 10 تا فيلد متفائت ديگه داره بهش ميگي يكي از علي ها رو نشون بده .خب اون بايد كدوم نمونه اش رو نشون بده؟كاري كه ميتوني بكني اينكه بر اساس يه ستون distinct كني و يك ستون ديگه هم داشته باشي كه كليد اصلي اون نام باشه و از بقيه select نگيري. حالا ميتوني بقيش رو join بزني با جدول اصليت توسط همون كليد اصلي كه گفتم يا خودت بصورت دستي اون فيلدهايي كه ميخواي بعد از select و distinct بياري.
جدولهاتو بذار و بگو دقيقا چي ميخواي تا راهنماييت كنم.

Mahmoud.Afrad
چهارشنبه 18 مرداد 1391, 10:58 صبح
با توجه به اینکه به بحث ادامه دادید

برای این منظور کوئری زیر پاسخ شماست
سلکت با distinct فقط روی یک ستونselect-distinct-on-one-column
SELECT *
FROM (SELECT * , ROW_NUMBER()
OVER (PARTITION BY [SpecificColumnForDistinct] ORDER BY [ColumnForOrderBy]) AS RowID
FROM [Table_Name]
) AS dt
WHERE dt.RowID = 1
به جای SpecificColumnForDistinct نام فیلدی رو بنویسید که میخواهید تکراری نباشه
به جای ColumnForOrderBy هم نام فیلدی را برای مرتب کردن باید بنویسید
به جای Table_Name هم نام جدول را قرار بده.
اون عدد 1 رو هم اصلا دست نزنید.

majidrezaei2007
چهارشنبه 18 مرداد 1391, 16:28 عصر
خب ساختار جدول من اینطوریه .
این جدول مربوط به دروس هست . در رشته های مختلف نام بعضی از درس ها فرق می کنه .
مثلا برنامه سازی پیشرفته و برنامه سازی 2
این 2 درس دقیقا یکی هستند و شماره درسشون هم بعضا یکیه
حالا من می خوام که روز و ساعت امتحان این درس رو بیرون بکشم که خب مسلما برای تمامی رشته های یک دانشگاه ، این درس در یک روز و ساعت برگزار میشه .
select من می خواستم اینطوری باشه که از اون شماره درس فقط یک نمونشو بیاره و اصلا به موارد دیگش مانند عنوان درس و روز و ساعت تشکیل و ... توجه نکنه

که با تشکر فراوان از دوست خوبم mafaman2003 به نتیجه رسیدم
از بقیه دوستان هم تشکر می کنم

majidrezaei2007
چهارشنبه 18 مرداد 1391, 16:35 عصر
شما از همون distinct استفاده کن. فقط بجای اینکه موقع select کردن * بزاری و همه فیلدها رو انتخاب کنی، فقط همون فیلدی رو انتخاب کن که میخوای تکراری نباشه. یعنی اینطوری:

SELECT DISTINCT lnumber FROM Table1

از این روش نمیشه ، چون به تمام فیلد های جدول نیاز دارم

majidrezaei2007
چهارشنبه 18 مرداد 1391, 16:37 عصر
اينجوري كه نميشه عزيز من! فرض كن به sql گفتي از ده تا ركوردي كه نامش علي هست و 10 تا فيلد متفائت ديگه داره بهش ميگي يكي از علي ها رو نشون بده .خب اون بايد كدوم نمونه اش رو نشون بده؟كاري كه ميتوني بكني اينكه بر اساس يه ستون distinct كني و يك ستون ديگه هم داشته باشي كه كليد اصلي اون نام باشه و از بقيه select نگيري. حالا ميتوني بقيش رو join بزني با جدول اصليت توسط همون كليد اصلي كه گفتم يا خودت بصورت دستي اون فيلدهايي كه ميخواي بعد از select و distinct بياري.
جدولهاتو بذار و بگو دقيقا چي ميخواي تا راهنماييت كنم.

از این روش هم نمیشه ، چون distinct در صورتی که تمام فیلد های جلوش یکی باشن . فیلد نام یکی هست ، اما کلید که تفاوت داره دیگه . یعنی الحاق این دو فیلد در هیچ 2 رکوردی تکراری نمیشه . در نتیجه بازم همه رو تو خروجی میاره

m.amjadi
سه شنبه 24 مرداد 1391, 14:09 عصر
سلام میتونی بر اساس فیلدی که میخوای group by کنی و تو هر کدوم (اگه واست فرق نمیکنه) با استفاده از max,min یا تابع های دیگه یکی شو بگیری

select lnum , max(ID)
from
urTbl
group by lnum



حالا این یک جدول هستش که یک آی دی و مقدار های بدون تکرار فیلد رو بهت بر میگردونه حالا میتونی بعنوان یک جدول دیگه ازش استفاده کنی مثل این

select *
from urtbl,
(select lnum ,
max(ID) as MID
from
urTbl
group by lnum)
as urTbbl1
where ID = MID