PDA

View Full Version : عملیات distinct‌با چند فیلد امکان نداره ؟؟؟



L_eskandary
پنج شنبه 01 مهر 1389, 23:48 عصر
سلام بر دوستان مهندسم ...
اگه بخوام از یه جدولی که یکی از ستون های اون دارای مقادیر تکراری هستن چند ستون رو انتخاب کنم و البته با حذف مقادیر تکراری ، چیکار باید بکنم ؟
ظاهرا امکان اینکه بشه از distinct‌برا حذف مقادیر تکراری استفاده شه وجود نداره !!!:متفکر:

بهزادصادقی
جمعه 02 مهر 1389, 02:26 صبح
سلام بر دوستان مهندسم ...
اگه بخوام از یه جدولی که یکی از ستون های اون دارای مقادیر تکراری هستن چند ستون رو انتخاب کنم و البته با حذف مقادیر تکراری ، چیکار باید بکنم ؟
ظاهرا امکان اینکه بشه از distinct‌برا حذف مقادیر تکراری استفاده شه وجود نداره !!!:متفکر:

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



declare @table table (firstCol int, secondCol int, thirdCol int );
insert @table values (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3);

select t.firstCol, t.secondCol, t.thirdCol from @table t;
select distinct t.firstCol, t.secondCol, t.thirdCol from @table t;


حالا اگر شما دوباره با دقت بیشتری صورت مسئله خود را توصیف کنی، من متشکر می شوم.

L_eskandary
جمعه 02 مهر 1389, 11:53 صبح
ببینید استفاده از distinct‌زمانی جواب می دهد که تمام فیلدهای انتخابی داری مقدار یکسان باشند مثلا (1و2و3) را اگر چند بار بصور تکراری insert‌کنیم با distinct‌ می توان فقط یک رکورد را انتخاب نمود . ولی فرض کنید من یک جدول دارم که شماره های موبایل افراد در آن ثبت شده و این احتمال وجود داره که یک شماره برای چند نفر ثبت شود بنابراین امکان unique‌بودن وجود ندارد که بتوان با distinct‌ فقط یک سطر را انتخاب نمود .
حالا کاری که من می خوام بکنم اینه که فرض کنید پیغامی را برای شماره های موجود بفرستم ولی به همراه شماره ها ، نام و شماره ضروری را هم select‌می کنم و این باعث میشه که همه رکورد ها انتخاب شن حتی اگه از distinct‌هم استفاده کنم ...من می خوام اگه شماره ای برا چند نفر ثبت شده فقط یکبار به آن شماره پیام بفرستم .
با تشکر ...

بهزادصادقی
جمعه 02 مهر 1389, 13:53 عصر
ببینید استفاده از distinct‌زمانی جواب می دهد که تمام فیلدهای انتخابی داری مقدار یکسان باشند مثلا (1و2و3) را اگر چند بار بصور تکراری insert‌کنیم با distinct‌ می توان فقط یک رکورد را انتخاب نمود . ولی فرض کنید من یک جدول دارم که شماره های موبایل افراد در آن ثبت شده و این احتمال وجود داره که یک شماره برای چند نفر ثبت شود بنابراین امکان unique‌بودن وجود ندارد که بتوان با distinct‌ فقط یک سطر را انتخاب نمود .
حالا کاری که من می خوام بکنم اینه که فرض کنید پیغامی را برای شماره های موجود بفرستم ولی به همراه شماره ها ، نام و شماره ضروری را هم select‌می کنم و این باعث میشه که همه رکورد ها انتخاب شن حتی اگه از distinct‌هم استفاده کنم ...من می خوام اگه شماره ای برا چند نفر ثبت شده فقط یکبار به آن شماره پیام بفرستم .
با تشکر ...

با عرض معذرت، برای من هنوز مفهوم واقع نشده شما دقیقا می خواهید select شما چه کار کند.

می شود از شما خواهش کنم یک مثال دقیق با داده های اصلی بزنید.

بی زحمت ساختار دقیق جدول خود را اینجا ذکر کنید (منجمله اسم و نوع تمام ستون های لازم و اسم جدول اصلی خود، ترجیحا با استفاده از دستور create table). بعد لطفا 5 سطر نمونه را هم برای ما بیاورید (ترجیجا با استفاده از دستور insert). بعد هم بی زحمت یک جدول دیگر را درج کنید که دقیقا نتایچ و خروجی select ای می باشد که می خواهید روی جدول اصلی خود اجرا نمایید. منظورم این است که نگوئید من این یا آن را می خواهم، نتیجه را که دنبالش هستید را توصیف نکنید، بلکه آن را دقیقا نشان بدهید، بیائید و دقیقا سطر ها و ستون هایی را که خروجی query مورد نطرتان می باشد را اینجا درج کنید.

با تشکر.

L_eskandary
جمعه 02 مهر 1389, 14:15 عصر
tblemployee(name , phone1 , phone2 , email)
tblemployeegroip(empPhone1 , groupname)
employee((s , 0912342344,09124567 , s@lll.com), (l,09121321,09123434,ll@k.com) , (dd , 091434355,093434343, gh@dg.com))
employeegroup((0912342344, master), (0912342344,seller),(09121321,master))
select name , phone1 , phone2 , email , groupname from tblemployee inner join tblemployeegroup on phone1=empphone1

خوب حالا جواب query میشه :

s , 0912342344,09124567 , s@lll.com,master
s , 0912342344,09124567 , s@lll.com,seller
l,09121321,09123434,ll@k.com,master

من می خوام یکبار s رو انتخاب کنم با دستور distinct‌هم به علت تفاوت در groupname این امکان وجود نداره... همین...

Rezahak
جمعه 02 مهر 1389, 14:47 عصر
خب شما با توجه به اید رکوردهایی که نوشتی اگر فیلد آخر را از فیلدهای select خارج کنی با distinct مشکلتون حل می شه

L_eskandary
جمعه 02 مهر 1389, 15:10 عصر
خب شما با توجه به اید رکوردهایی که نوشتی اگر فیلد آخر را از فیلدهای select خارج کنی با distinct مشکلتون حل می شه

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

بهزادصادقی
جمعه 02 مهر 1389, 15:12 عصر
tblemployee(name , phone1 , phone2 , email)
tblemployeegroip(empPhone1 , groupname)
employee((s , 0912342344,09124567 , s@lll.com), (l,09121321,09123434,ll@k.com) , (dd , 091434355,093434343, gh@dg.com))
employeegroup((0912342344, master), (0912342344,seller),(09121321,master))
select name , phone1 , phone2 , email , groupname from tblemployee inner join tblemployeegroup on phone1=empphone1

خوب حالا جواب query میشه :

s , 0912342344,09124567 , s@lll.com,master
s , 0912342344,09124567 , s@lll.com,seller
l,09121321,09123434,ll@k.com,master

من می خوام یکبار s رو انتخاب کنم با دستور distinct‌هم به علت تفاوت در groupname این امکان وجود نداره... همین...

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

SQL یک کار ذهنی نیست. در SQL ما با داده های خیلی قابل لمسی کار می کنیم: با جداولی که درونشان داده های قابل لمسی است، با ستونهایی که اسم قابل لمسی دارند و در درونشان داده های قابل لمسی است. با سطرهایی که وجود خارجی دارند و قابل لمس می باشند. با یک دستور SELECT که تعریفش از چند کلمه خیلی دقیق قابل لمس ساخته شده و خود کدش هم کاملا واضح و قابل لمس است.

در این تالار، دوستان خیلی مواقع سوالاتی طرح می کنند که اصلا در طرحش حتی یک بار از کلمه ای مثل جدول، ستون، سطر، نوع داده و غیره استفاده نشده. بعد انتظار دارند یک نفر بهشان بگوید چه جوری یک select بنویسند که مشکلشان را حل می کند.

به هر حال، من از شما تشکر می کنم که قدم اولیه را برداشتید تا مشکل خود را قابل فهم برای دیگران نمایید. ولی این قدم کافی نیست. آن بدبخت بیچاره ای که می خواهد به شما کمک کند، باید هنوز بیایید و نوشته های شما را ترجمه کند به زبان SQL. اگر این کار را نکند، جوابش از صورت مسئله گنگ اولی شما هم گنگ تر خواهد بود. برای دادن جواب صحیح به سوالی مانند نحوه صحیح نوشتن یک دستور select خاص، باید گفتگوهایمان به زبان SQL باشد، وگرنه احتمال بروز سوء تفاهم تقریبا صد در صد می شود.

قبل از اینکه من بتوانم به شما کمک کنم، من لازم دارم که صورت مسئله شما به صورتی باشد که در SQL Server قابل اجرا باشد. در یک همچین صورتی، من می دانم مسئله ای که دارم روش کار می کنم همان مسئله ای است که شما طرح کرده اید. و اگر راه حلی ارائه کردم، چون همراه با کد قابل اجرا روی داده هایی می باشد که هم شما و هم من به آن دسترسی داریم، شما می دانید که راه حل من دقیقا چیست، هم خودش هم ورودی اش و هم خروجی اش، و می توانید با اجرای آن تصمیم بگیرید که کار می کند یا نه، و اگر کار نمی کند، شما دقیقا به من می توانید بگویید که مشکل در کدام سطر و کدام ستون می باشد. دیگر لازم به استفاده از ایماء و اشاره نیست.

من آمده ام و اطلاعات شما را به صورت یک اسکریپت در آورده ام که اگر هر کس در Management Studio آن را اجرا کند، دو تا جدول لازم و داده های تست و متن query ای را که شما با آن مشکل دارید را به وجود می آورد. خواهش می کنم آن را اجرا کنید و به من بگویید که آیا این اسکریپت سازه های صورت مسئله شما را درست به وجود می آورد یا خیر. اگر آری، من می توانم در قدم بعدی اقدام به کمک به شما برای حل صورت مسئله تان نمایم.



create table tblemployee(name nvarchar(100) , phone1 nvarchar(100) , phone2 nvarchar(100) , email nvarchar(100));

create table tblemployeegroup( empPhone1 nvarchar(100), groupname nvarchar(100) );

insert tblemployee values ('s' , '0912342344', '09124567' , 's@lll.com'), ('l', '09121321', '09123434', 'll@k.com'), ('dd', '091434355' ,'093434343', 'gh@dg.com');
insert tblemployeegroup values ('0912342344', 'master'), ('0912342344','seller'),('09121321','master');

select * from tblemployee;
select * from tblemployeegroup;

select
e.name,
e.phone1,
e.phone2,
e.email,
g.groupname
from
tblemployee e
inner join
tblemployeegroup g
on
e.phone1= g.empPhone1;

L_eskandary
جمعه 02 مهر 1389, 15:41 عصر
من آمده ام و اطلاعات شما را به صورت یک اسکریپت در آورده ام که اگر هر کس در Management Studio آن را اجرا کند، دو تا جدول لازم و داده های تست و متن query ای را که شما با آن مشکل دارید را به وجود می آورد. خواهش می کنم آن را اجرا کنید و به من بگویید که آیا این اسکریپت سازه های صورت مسئله شما را درست به وجود می آورد یا خیر. اگر آری، من می توانم در قدم بعدی اقدام به کمک به شما برای حل صورت مسئله تان نمایم.

تشکر مجدد به خاطر وقتی که اختصاص دادین . واقعیتش این مشکل اغلب ماست که اغلب اوقات برای رسیدن سریعتر به جواب ، چند برابر وقت معقول برا حل مسئله رو صرف می کنیم و این بار در مورد من صادق هستش ...
به هر حال script شما دقیقا کاری که مد نظر من هست انجام می دهد .
حالا شاید یه خرده هم باید از web fom بگم ...
راستش من گروهها رو به checklist‌بایند کرده ام و قرار هست با انتخاب هر گروه اطلاعات مربوط به کارمندان آن گروه در یک datatable ذخیره شه در واقع اطلاعات مربوط به هر گروه به اطلاعات مربوط به گروه قبلی که انتخاب شده اضافه میشه .حالا من می خوام اگه شماره ای در این datatable تکراری باشه حذف کنم و یا اینکه عمل send رو در مورد اون فقط یکبار انجام بدم.
موفق باشین ...

بهزادصادقی
جمعه 02 مهر 1389, 16:58 عصر
تشکر مجدد به خاطر وقتی که اختصاص دادین . واقعیتش این مشکل اغلب ماست که اغلب اوقات برای رسیدن سریعتر به جواب ، چند برابر وقت معقول برا حل مسئله رو صرف می کنیم و این بار در مورد من صادق هستش ...
به هر حال script شما دقیقا کاری که مد نظر من هست انجام می دهد .
حالا شاید یه خرده هم باید از web fom بگم ...
راستش من گروهها رو به checklist‌بایند کرده ام و قرار هست با انتخاب هر گروه اطلاعات مربوط به کارمندان آن گروه در یک datatable ذخیره شه در واقع اطلاعات مربوط به هر گروه به اطلاعات مربوط به گروه قبلی که انتخاب شده اضافه میشه .حالا من می خوام اگه شماره ای در این datatable تکراری باشه حذف کنم و یا اینکه عمل send رو در مورد اون فقط یکبار انجام بدم.
موفق باشین ...

مرسی.

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

خوب، حال ما یک محیط تست داریم که در آن می توانیم صورت مسئله و راه حل های پیشنهادی را بررسی کنیم.

اول از صورت مسئله شروع می کنم:

در یکی ای ایمیل هایتان بعد از درج خروجی select بالا، شما فرموده بودید:



من می خوام یکبار s رو انتخاب کنم


من نمی دانم تعبیر دقیق این جمله چیست. آیا منظورتان این است که می خواهید به غیر از سطر اول، هر سطر دیگری را که s در آن تکرار شده است را حذف کنید؟ (فکر نکنم این را می خواهید) آیا می خواهید از آن دو تا s که در ستون name سطرهای شماره یک و دو مجموعه جواب می بینید فقط یکی شان دیده شود؟ (حدس من این است که شما دنبال این هستید.) اگر جواب آری است، در اون صورت دوست دارید که به جای s حذف شده در یکی از اون سطر ها، چه مقداری در آن ستون دیده شود؟ آیا برای شما فرق می کند که از بین این دو تا سطر، کدامشان s اش حذف شود؟ اگر فرق می کند، می شود توضیح دهید که select ما باید بر مبنای چه ضوابتی از بین همه سطرهایی که سطون name آنها یکسان است، یکی را انتخاب کند که محتوای ستون name اش را نگه دارد؟ سرانحام، آیا برای شما فرق می کند که در مجموعه نتایج این select، ترتیب نمایش سطرهای نهایی چه می باشد؟ آیا ما می توانیم اول همه سطرهایی را نشان دهیم که ستون name شان خالی نیست، و بعد همه آنهایی که ستون name شان خالیست؟

خلاصه، فکر کنم دغدغه من را می بینید. تا وقتی من جواب این سوالات را ندانم نمی توانیم دستور select دلخواه شما را طراحی کنم.

پیشنهاد من این است: کد بالا را عوض کنید طوری که جداولتون بین 7 تا 10 تا سطر داشته باشند. سه تا سطر معمولا برای پوشش دادن بیشتر شرایط ممکنه کافی نیست. بعد، دقیقا یا با دست یا با تولید یک جدول جداگانه مجموعه نتیجه select خود را ترسیم کنید. یعنی دقیقا نشان دهید که در هر سطر، در هر ستون، با توجه به داده های تست شما، چه مقداری باید دیده شود. ترتیبت سطر ها را هم دقیقا مشخص کنید.

مرسی

L_eskandary
جمعه 02 مهر 1389, 17:35 عصر
پیشنهاد من این است: کد بالا را عوض کنید طوری که جداولتون بین 7 تا 10 تا سطر داشته باشند. سه تا سطر معمولا برای پوشش دادن بیشتر شرایط ممکنه کافی نیست. بعد، دقیقا یا با دست یا با تولید یک جدول جداگانه مجموعه نتیجه select خود را ترسیم کنید. یعنی دقیقا نشان دهید که در هر سطر، در هر ستون، با توجه به داده های تست شما، چه مقداری باید دیده شود. ترتیبت سطر ها را هم دقیقا مشخص کنید.


ببينيد مسئله خيلي پيچيده اي نبايد باشد . من مي خواهم اگر مثلا براي فرد s دو سطر در نتيجه select بدست آمد بررسي كنم اگر داراي phone1 ، phone2‌ و يا ايميل يكسان بودند فقط يكي را انتخاب كنم . همين ...
ترتيب انتخاب آنها اصلا مهم نيست . به هر حال مي خواهم براي يك كاربر اگر پيامي ارسال مي شود فقط يكبار به يك شماره خاص ارسال داشته باشيم .

بهزادصادقی
جمعه 02 مهر 1389, 18:26 عصر
ببينيد مسئله خيلي پيچيده اي نبايد باشد . من مي خواهم اگر مثلا براي فرد s دو سطر در نتيجه select بدست آمد بررسي كنم اگر داراي phone1 ، phone2‌ و يا ايميل يكسان بودند فقط يكي را انتخاب كنم . همين ...
ترتيب انتخاب آنها اصلا مهم نيست . به هر حال مي خواهم براي يك كاربر اگر پيامي ارسال مي شود فقط يكبار به يك شماره خاص ارسال داشته باشيم .

این آخرین جواب من به پیغام شما خواهد بود، چون شما حاضر نیستید حتی صورت مسئله خود را طوری بیان کنید که شخصی مثل من که می خواهد به شما کمک کند بتواند آن را بفهمد و به شما کمک کند. من چرا وقت خود را تلف کنم؟

امیدوارم دوستان دیگر بتوانند بر خلاف من صورت مسئله شما را با همان توضیحاتی که زحمت کشیده اید و داده اید درک کنند و شما را در حل مسئله خویش یاری کنند. من از بابت ناتوانی خود در درک چنین مسئله ساده ای از حضور شما درخواست بخشش می نمایم.

esmit61
جمعه 02 مهر 1389, 19:01 عصر
دوست عزیز شما تمام فیلدهایی که مد نظرت هست رو بنویس و برای یکی از فیلدها Distinct کن
مثلاً شما فیلدهای f1,f2,f3,f4 دارید. میخواهید سطرهایی که مقدار این 4 تا فیلدشون یکسان هستند، فقط یکبار در خروجی نمایش داده بشن.
اینجوری بنویسید:
Select Distinct(f1),f2,f3,f4 from Table1

behrouzlo
شنبه 03 مهر 1389, 10:37 صبح
Distinct بر روی سطر اعمال می شود و نه بر روری فیلد فکر کمک پست بالا درست جواب نده. شما باید یا اسامی گروهها را در یک فیلد ترکیب کنید و به صورت master,seller بنویسید یا که خروجیتان همان حالتی که خودتان نوشتید خواهد بود

Javad_raouf
جمعه 09 مهر 1389, 15:03 عصر
سلام دوستان من تمام پست های تاپیک رو مطالعه کردم
همچنین پست آقای صادقی
ولی خوب متوجه نشدم
من یک جدول دارم که سه تا فیلد داره:

f1,f2,f3

سه تا رکورد هم داریم:

a,b,c
a,b,d
e,f,g

حالا می خوام دستور Select بنویسم که رکورد هایی که دو فیلد اولشان یکی هست رو یک بار نشون بده
حال یک سوال بوجود می آید که این select که قرار است رکورد 1 و 2 را که دو فیلد اولشان یکی است را یک بار نشان بده باید در فیلد سوم C رو قرار بده یا D ؟
من می خوام D رو نشون بده یعنی آخرین رکورد
در حقیقت می خوام دستوری بنویسم که جوابش این بشه:

a,b,d
e,f,g
لطفا کمکم کنید
--------------
می دونم جواب رو آقای صادقی دادن ولی چون دو تا جدول بود من یکم گیج شدم و نفهمیدم چی شد:متفکر:

بهزادصادقی
جمعه 09 مهر 1389, 18:56 عصر
می دونم جواب رو آقای صادقی دادن ولی چون دو تا جدول بود من یکم گیج شدم و نفهمیدم چی شد:متفکر:

البته من هیچ وقت جواب سوال اصلی جناب اسکندری را ندادم، چون اصلا متوجه صورت مسئله ایشان نشدم. ولی شما اطلاعات خیلی دقیق تری را فراهم آورده ای و بر خلاف صورت مسئله ایشان، صورت مسئله شما تقریبا قابل فهم است. فکر کنم بتوانم جواب شما را بدهم. ولی اول دو تا سوال:

1. شما می گویید:



حال یک سوال بوجود می آید که این select که قرار است رکورد 1 و 2 را که دو فیلد اولشان یکی است را یک بار نشان بده باید در فیلد سوم C رو قرار بده یا D ؟
من می خوام D رو نشون بده یعنی آخرین رکورد


منظورتان از آخرین رکورد چیست؟ SQL Server از کجا بداند کدام رکورد آخرین رکورد است؟ آیا منظورتان این است که بین c و d، چون d در الفبا بعد از c می آید، باید آن را انتخاب کرد؟ (در جواب ذیل، پیش فرض من این است که منظور شما از آخرین مقدار ستون f3، «آخرین» بر اساس ترتیب حروف البفا می باشد.) یا اینکه بر این اساس که رکوردی که ستون f3 آن d می باشد بعد از رکوردی که ستون f3 آن c می باشد وارد چدول شده؟ اگر منظورتان این است، SQL Server از کجا باید بداند هر رکورد کی وارد جدول شد؟ شما که هیچ ستونی در جدول خود لحاظ نکرده اید که تاریخ ثبت اولیه هر رکورد را ذخیره کند.

2. فرض کنید که یک رکورد دیگر هم در جدول وجود داشت که a, b, d بود. در آن صورت query ما باید چه کار کند؟ هر دو سطر را بر گرداند. یا یک سطر را؟ در جواب ذیل، من فقط یک سطر باز می گردانم.

کد زیر شاید یک مقدار پیچیده به نظر برسد، ولی در حقیقت خیلی ساده است. اکثر خط های آن فقط کار ساخت یک جدول تست را انجام می دهند. دستور select ای که شما دنبالش هستید، آخرین select متن ذیل می باشد. من دوست ندارم فقط یک کد خالی به عنوان جواب یک سوال درج کنم. چرا که شما از کجا می توانید بدانید که کد من درست کار می کند. پس، من سعی می کنم همیشه جواب های خویش را با کدی اضافه تحویل دهم که به شما اجازه می دهد با اجرای آن یک جدول آزمایشی به وجود بیاورید تا نتیجه اجرای کد جواب من را بتوانید بلافاصله خودتان مشاهده کنید.

کد زیر اول چک می کند ببیند آیا یک جدول به اسم dbo.Javad_Raouf_Example وجود دارد یا نه. اگر آری، آن را پاک می کند. بعد می آید و آن جدول را از اول می سازد و بعد سه تا رکورد تست شما را وارد آن می کند. یک select اولیه به شما نشان می دهد که رکوردهای جدول همانی است که شما در بالا توصیف کرده اید. دستور select بعدی همان مجموعه نتیجه ای را که شما دنبالش هستید می دهد. شما می توانید این کد را دقیقا همان طوری که هست کپی کرده و در درون SQL Server Management Studio اجرایش کنید.

آیا این آن چیزی است که شما دنبالش بودید؟



if object_id( 'dbo.Javad_Raouf_Example' ) is not null begin
drop table dbo.Javad_Raouf_Example;
end;

create table dbo.Javad_Raouf_Example
(
f1 nvarchar(10),
f2 nvarchar(10),
f3 nvarchar(10)
);

insert dbo.Javad_Raouf_Example values ('a', 'b', 'c' ), ('a', 'b', 'd'), ('e', 'f', 'g');

select * from dbo.Javad_Raouf_Example;

select
x.f1,
x.f2,
max( x.f3 )
from
dbo.Javad_Raouf_Example x
group by
x.f1,
x.f2;

Javad_raouf
جمعه 09 مهر 1389, 19:29 عصر
خیلی عالی:تشویق:
واقعا مرسی لذت بردم:خجالت:
واقعا بابت وقتی که گذاشتید ممنونم
------------
دستور به درستی کار می کند
ولی بنده منظورم این بود:

بر این اساس که رکوردی که ستون f3 آن d می باشد بعد از رکوردی که ستون f3 آن c می باشد وارد چدول شده؟

اگر منظورتان این است، SQL Server از کجا باید بداند هر رکورد کی وارد جدول شد؟
فرض کنید یک رکورد کلید هم داریم که از روی بزرگتر بودن عدد کلید می توان فهمید که دیرتر به جدول اضافه شده
پیشاپیش از کمکتون ممنون

بهزادصادقی
جمعه 09 مهر 1389, 19:44 عصر
ولی بنده منظورم این بود:

فرض کنید یک رکورد کلید هم داریم که از روی بزرگتر بودن عدد کلید می توان فهمید که دیرتر به جدول اضافه شده


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

Javad_raouf
جمعه 09 مهر 1389, 19:59 عصر
این صورت مسئله را کاملا تغییر می دهد. من الان روی کدش کار می کنم. ولی گلایه همیشگن من از دوستان باقی می ماند. با ندادن اطلاعات دقیق، ما وقت گرانبهای دوستانی را که از خود انرژی و زمان می گذارند تا مسائل ما را حل کنند را تلف می کنیم. بارها شده است من بین 30 دقیقه تا یک ساعت وقت گذاشته ام تا برای یکی از دوستان در این سایت راه حل مناسبی پیدا کنم. ولی به محض درج جواب، ایشان یک مسئله کلیدی یادشان می آید که دز صورت مسئله شان درج نکرده بودند که جواب را کاملا تغییر می دهد. حلا کم کم دارم می فهمم چرا اینجا جواب اکثر دوستان یکی دو خط بیشتر نمی باشد.
مرا شرمنده نکنید:افسرده:
این را بگذارید از عدم آگاهی ما
چون خیلی چیز ها مهمه ولی از نظر ما تازه وارد ها مهم به نظر نمی آید
این فقط از نا آگاهی ماست:اشتباه:

بهزادصادقی
جمعه 09 مهر 1389, 20:34 عصر
if object_id( 'dbo.Javad_Raouf_Example' ) is not null begin
drop table dbo.Javad_Raouf_Example;
end;

create table dbo.Javad_Raouf_Example
(
id int identity(1,1),
f1 nvarchar(10),
f2 nvarchar(10),
f3 nvarchar(10)
);

insert
dbo.Javad_Raouf_Example (f1, f2, f3)
values
('a', 'b', 'c' ), ('a', 'b', 'd'), ('e', 'f', 'g');

select * from dbo.Javad_Raouf_Example;

with PartitionedTable as
(
select
x.f1,
x.f2,
x.f3,
row_number() over( partition by x.f1, x.f2 order by x.id desc ) rn
from
dbo.Javad_Raouf_Example x
)
select
p.f1,
p.f2,
p.f3
from
PartitionedTable p
where
p.rn = 1
order by
p.f1,
p.f2;