PDA

View Full Version : سوال: Find Duplicates



reza_1199
شنبه 01 خرداد 1400, 22:22 عصر
سلام و خسته نباشید خدمت اساتید و دوستان . دوستان عزیز در نمونه پیوستی یک کویری Duplicates تحت یک شرایط خاص میخوام که سواد خودم نرسید ممنون میشم اساتید و دوستان راهنمایی و اصلاح کنن نمونه برنامه رو واقعا از زحماتتون ممنونم.

mazoolagh
یک شنبه 02 خرداد 1400, 11:13 صبح
اول خواسته رو با توضیح دقیق همینجا بنویسین، شاید اصلا نیازی به پیوست نمونه نباشه.

reza_1199
یک شنبه 02 خرداد 1400, 16:59 عصر
با عرض سلام خدمت استاد mazoolagh در نمونه پیوستی ایرادات مربوط به ماشین در یک فرم ثبت میشه که این ایرادات میتونه با توقف یا بدون توقف باشه و همچنین بر حسب نوع ایراد قسمت برق و مکانیک میتونن رو اون ماشین کار کنن حالا نتیجه مد نظر من یه کویریه که بیاد بر حسب نوع توقف ( با توقف یا بدون توقف ) بودن ماشین بیاد اونا رو تفکیک کنه و علاوه براون اگر ماشین به فرض از ساعت ده تا ساعت چهارده در اختیار مکانیک بوده که نوع توقف اون با توقف بوده میزان توقف ماشین چهار ساعت معادل 240 دقیقه میشه حالا در همون حین برق هم رو اون ماشین کلر کرده و چون توسط مکانیک ماشین توقف بوده و برق به فرض از ساعت سیزده تا پانزده رو اون ماشین کار کرده بیاد مجموع توقف ماشین رو از ساعت ده که دست مکانیک بوده تا ساعت پانزده که برق تموم کرده محاسبه کنه یعنی بشه توقف از ساعت ده تا پانزده معادل پنج ساعت که میشه 300 دقیقه و این تایم مشترک رو حساب کنه حالا ممکنه تو همون تاریخ باز همون ماشین خراب بشه به فرض از ساعت 21 تا 22 دیگه کویری نیاد از ساعت پانزده که ماشین رو تحویل دادن تا 21 کار کرده و باز توقف خورده و من نمیخوام که اینو رو اون توقف حساب کنه و فقط تایم مشترک رو حساب کنه امیدوارم که توضیحم مفصل و جامع بوده باشه هر چند حس خودم میگه گنگ بوده ولی تو نمونه برنامه کامل و واضح
باز ممنون استاد (این روزا یه مقدار بی حوصله شدین استاد )

mazoolagh
دوشنبه 03 خرداد 1400, 10:58 صبح
سلام و روز خوش
هر چه پرسش رو گویاتر مطرح کنین پاسخ بهتر و احتمالا در زمان کمتری میگیرین و به حوصله مربوط نیست!

توضیحی که دادین گنگ نبود - و نهایتا یک اسکرین شات هم کفایت میکرد.

پرسش شما یک مسئله عمومی است که بهش event overlap یا time overlap یا time periods overlap و ... میگن (کلا همپوشانی بازه زمانی یا تاریخی) و اگر اطلاعات بیشتری خواستین میتونین این عبارتها رو گوگل کنین.
البته همپوشانی میتونه روی مقادیر هم باشه.
نگران اینکه این موضع برای شما سخت بوده هم نباشید چون در واقع سخت هم هست، و البته موضوع مفیدی رو مطرح کردین که میتونه برای دیگران هم مفید باشه.
برای همین ترجیح میدم بجای حل مستقیم توضیح بیشتری بدم :

وضعیت 2 رخداد نسبت به هم میتونه شکل های مختلفی داشته باشه (6 حالت):
https://www.mssqltips.com/tipimages2/5854_find-events-that-overlap-or-not-sql-server-t-sql.001.png

mazoolagh
دوشنبه 03 خرداد 1400, 11:04 صبح
در مورد مسئله شما:
اول براساس طراحی جدول شما یک کوئری کلی مینویسیم :
SELECT T1.machin, T1.tarekh, T1.start AS T1START, T1.tend AS T1END, T2.start AS T2START, T2.tend AS T2END
FROM TABLE1 AS T1 INNER JOIN TABLE1 AS T2 ON T1.machin=T2.machin AND T1.tarekh=T2.tarekh AND T1.tavagof=T2.tavagof AND T1.ID<>T2.ID

ممکنه شما از *.T1 استفاده کنین.

mazoolagh
دوشنبه 03 خرداد 1400, 11:13 صبح
من کوئری یکی از حالتها رو مینویسم، بر اساس همین میتونین مابقی حالتها (اونهایی که نیاز دارین) رو خودتون تکمیل کنین.

با فرض اینکه کوئری پست قبلی رو به اسم TMPQRY ذخیره کرده باشیم:
SELECT * FROM TMPQRY WHERE T2START>=T1START And T2START<=T1END AND T2END>=T1END

بسته به شرایط مسئله ممکنه در شرط = رو حذف کنین.
همچنین میتونین از BETWEEN استفاده کنین.

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

reza_1199
دوشنبه 03 خرداد 1400, 22:47 عصر
استاد عزیز جناب آقای Mazoolagh بابت راهنمایی ارزشمند و مثل همیشه هوشمندانه بینهایت ممنون و سپاسگذارم و ممنون بابت اینکه باز بدون هیچ منت و چشم داشتی باز تابع دیگه ای رو معرفی و توضیح دادین البته هنوز با چند و چون این تابع درگیرم و سعی میکنم چیزهایی رو مطالعه و یاد بگیرم و خواسته خودمو در نهایت در بیارم که باز اگر موفق نشدم مجددا مزاحمتون میشم واقعا ممنون و بینهایت سپاس

mazoolagh
پنج شنبه 06 خرداد 1400, 13:19 عصر
ممنون از نظر لطف شما،
لطفا به همین نام مازولاق بسنده کنین.

این مسئله خیلی کاربردی هست : کنترل پروژه، انتخاب واحد دانشجوها، برنامه ریزی تولید و ....
بنابراین اگر هنوز مشکلی در چگونگی کار این کوئری یا تکمیل کار داشتین همینجا مطرح کنین ولی جدول رو با دیتا نمونه ای پر کنین که همه حالتها رو در بر داشته باشه.