PDA

View Full Version : در نظرنگرفتن داده‌هاى اضافى در يک بازه‌ى زمانى



hamed-p
جمعه 03 دی 1389, 15:50 عصر
با درود
يک نرم‌افزار حضور و غياب نوشتم و مى‌خوام در فاصله‌ى خاص مثلاً 5 دقيقه اگه کارمند دو يا چند بار کارت زده، فقط اولى را در نظر بگير.
فرض کنيم نام جدول Test و نام فيلدها RegTime از نوع datetime و personnel_Id از نوع int باشد.
خروجى جدولى است که نام هر پرسنل به همراه اولين زمان در فاصله‌ى در هر 5 دقيقه را نشان مى‌دهد.

با سپاس.

حمیدرضاصادقیان
پنج شنبه 09 دی 1389, 10:16 صبح
سلام.
باتوجه به ساختاری که نوشتید میشه به این شکل عمل کرد.



select Personelid,Min(Regtime) As regtime from Test
Where CAST(Regtime As Time)>='10:10' and CAST(Regtime As Time)<='10:15'
Group by personelid

hamed-p
دوشنبه 13 دی 1389, 13:23 عصر
با عرض پوزش، پاسخ شما هيچ ربطي به پُرسش من نداشت.
شما يك 5 دقيقه‌ى خاص را در نظر گرفته ايد؛ در صورتى‌كه همان‌طور كه در پرسش آمده، هر 5 دقيقه مد نظر است.
يعني مثلاً شكل زير:

شماره پرسنلي - ساعت ورود
1222 - 08:41
1222 - 08:42
1234 - 08:43
1222 - 09:21

پس از دستور مورد نظر به شكل زير درمى‌آيد:
1222 - 08:41
1234 - 08:43
1222 - 09:21

زمان 08:42 به خاطر اين‌كه در فاصله‌‌ى كمتر از 5 دقيقه از ساعت قبلي اين پرسنل خاص قرار گرفته حذف شده است.

حمیدرضاصادقیان
دوشنبه 13 دی 1389, 14:03 عصر
با عرض پوزش، پاسخ شما هيچ ربطي به پُرسش من نداشت.
شما يك 5 دقيقه‌ى خاص را در نظر گرفته ايد؛

دوست عزیز حداقل به خودت زحمت میدادی یک بار اجرا میکردی بعد اظهار نظر میکردی. با نمونه داده های شما تست شد.شما کافیه فقط این دستور رو مقداری بسط بدی و از Subquery استفاده کنی.

hamed-p
سه شنبه 14 دی 1389, 08:15 صبح
دوست عزیز حداقل به خودت زحمت میدادی یک بار اجرا میکردی بعد اظهار نظر میکردی. با نمونه داده های شما تست شد.شما کافیه فقط این دستور رو مقداری بسط بدی و از Subquery استفاده کنی.
براى اين‌كه مى‌فهميدم اين دستور درست نيست؛ نياز نيست اجراش كنم. اين كار مال آدمايى كه تازه با SQL آشنا شدند. شما توى اين دستور از دستور ِ Where استفاده كرديد و دقيقاً يك زمان خاصى را ملاك قرار داده ايد.
بفرماييد چگونه بايد از subquery استفاده كنم وقتي كه

1- حتى همين زمان 5 دقيقه هم مثال است و ممكن است كاربر عدد 3 را به عنوان پارامتر ورودي وارد كند.
2- وقتى كه نياز است همه‌ى 5 دقيقه‌هاى ميان 00:00 بامداد تا 23:59 نيمه‌شب مورد واكاوى قرار بگيرد.

يعنى روش شما پويا نيست!

داده‌هاى زير را در نظر بگيريد


000013966618 13890725 000000 001 010 0 1
000002059666 13890725 000001 001 017 0 1
000002059666 13890725 000002 001 017 0 1
000003513615 13890725 000006 001 017 0 1
000014015181 13890725 000006 001 009 0 1
000002068943 13890725 000008 001 010 0 1
000002088434 13890725 000010 001 018 0 1
000013993496 13890725 000010 001 009 0 1
000002092433 13890725 000012 001 010 0 1
000013975032 13890725 000013 001 017 0 1
000002057919 13890725 000014 001 009 0 1
000016236744 13890725 000016 001 017 0 1
000016236744 13890725 000017 001 017 0 1
000013970995 13890725 000019 001 009 0 1
000014022181 13890725 000020 001 017 0 1
000014022181 13890725 000021 001 017 0 1
000013984103 13890725 000021 001 010 0 1
000013976854 13890725 000026 001 009 0 1
000011887863 13890725 000026 001 010 0 1
000002038485 13890725 000030 001 010 0 1
000002037293 13890725 000032 001 017 0 1
000013985257 13890725 000034 001 009 0 1
000014394430 13890725 000035 001 010 0 1
000002060579 13890725 000035 001 017 0 1
000014394430 13890725 000036 001 010 0 1
000013592841 13890725 000037 001 009 0 1
000010162077 13890725 000044 001 017 0 1
000013971031 13890725 000045 001 010 0 1
000013965710 13890725 000047 001 010 0 1
000002038363 13890725 000047 001 009 0 1
000002038363 13890725 000048 001 009 0 1
000013965710 13890725 000048 001 010 0 1
000014001756 13890725 000125 001 016 0 1
000005717300 13890725 000125 001 024 0 1
000005717300 13890725 000126 001 024 0 1
000013992244 13890725 000127 001 016 0 1
000005717300 13890725 000141 001 009 0 1
000013992244 13890725 000143 001 009 0 1
000014001756 13890725 000148 001 009 0 1
000013978913 13890725 000152 001 016 0 1
000009137646 13890725 000152 001 019 0 1
000013978913 13890725 000153 001 016 0 1
000014001590 13890725 000157 001 017 0 1
000013978913 13890725 000212 001 018 0 1
000003711104 13890725 000220 001 015 0 1
000008691706 13890725 000252 001 015 0 1
000013979273 13890725 000426 001 020 0 1
000008691706 13890725 000429 001 021 0 1
000014167965 13890725 000440 001 008 0 1
000014167965 13890725 000539 001 017 0 1
000005985518 13890725 000546 001 010 0 1
000014164809 13890725 000559 001 010 0 1
000014167965 13890725 000625 001 008 0 1
000008691706 13890725 000647 001 022 0 1
000014167965 13890725 000706 001 009 0 1
000014167965 13890725 000726 001 016 0 1
000014167965 13890725 001531 001 009 0 1
000002032006 13890725 001552 001 015 0 1
000014167965 13890725 001558 001 015 0 1
000002032006 13890725 002022 001 008 0 1
000005804384 13890725 002659 001 011 0 1
000005804384 13890725 003002 001 012 0 1
000008691706 13890725 003216 001 021 0 1
000014167965 13890725 003219 001 009 0 1
000005713289 13890725 004329 001 020 0 1
000008691706 13890725 004540 001 022 0 1
000008691706 13890725 004702 001 021 0 1
000005713289 13890725 005626 001 019 0 1
000009152187 13890725 010235 001 011 0 1
000014167965 13890725 010704 001 008 0 1
000009152187 13890725 011112 001 014 0 1
000009152187 13890725 011117 001 014 0 1
000015294811 13890725 011842 001 020 0 1
000014202636 13890725 011955 001 017 0 1
000009152187 13890725 012037 001 011 0 1
000014163861 13890725 012231 001 017 0 1
000009152187 13890725 012551 001 014 0 1
000009152187 13890725 012638 001 011 0 1
000015294811 13890725 012815 001 019 0 1
000009152187 13890725 012822 001 014 0 1
000014163861 13890725 012831 001 016 0 1
000014163861 13890725 013018 001 009 0 1
000014163861 13890725 013234 001 016 0 1
000014202636 13890725 013726 001 016 0 1
000008453993 13890725 013835 001 011 0 1
000008453993 13890725 014154 001 014 0 1
000014202636 13890725 021355 001 017 0 1
000008453993 13890725 034114 001 011 0 1
000008453993 13890725 034121 001 011 0 1
000008453993 13890725 034140 001 011 0 1
000005713289 13890725 035017 001 020 0 1
000014202636 13890725 035728 001 015 0 1
000005713289 13890725 040147 001 019 0 1
000014202636 13890725 040504 001 017 0 1
000014167965 13890725 042139 001 009 0 1
000014202636 13890725 042318 001 015 0 1
000015294811 13890725 042359 001 020 0 1
000015294811 13890725 042802 001 019 0 1
000014167965 13890725 043802 001 008 0 1
000014167965 13890725 044905 001 011 0 1
000014167965 13890725 044916 001 018 0 1
000015294811 13890725 050720 001 020 0 1
000008707333 13890725 053423 001 016 0 1
000009152187 13890725 053639 001 011 0 1
000015294811 13890725 053814 001 019 0 1
000008453993 13890725 054151 001 011 0 1
000013974149 13890725 054217 001 010 0 1
000011877398 13890725 054232 001 010 0 1
000008453993 13890725 054858 001 011 0 1
000008453993 13890725 055245 001 014 0 1
000008707333 13890725 055247 001 018 0 1
000011924701 13890725 055309 001 010 0 1
000009958379 13890725 055454 001 010 0 1
000013964900 13890725 055459 001 010 0 1
000013629963 13890725 055821 001 010 0 1
000008691706 13890725 060303 001 022 0 1
000008691706 13890725 060557 001 021 0 1
000011924701 13890725 060610 001 008 0 1
000013629963 13890725 061507 001 008 0 1
000013629963 13890725 061542 001 010 0 1
000002063738 13890725 062040 001 024 0 1
000002063738 13890725 062055 001 009 0 1
000013974149 13890725 062117 001 008 0 1
000013974149 13890725 062623 001 010 0 1
000013974149 13890725 062628 001 010 0 1
000013974149 13890725 062659 001 008 0 1
000009958379 13890725 062815 001 008 0 1
000013964900 13890725 062818 001 008 0 1
000011877398 13890725 062824 001 008 0 1
000011911684 13890725 063417 001 010 0 1
000015294811 13890725 063423 001 020 0 1
000011911684 13890725 063541 001 008 0 1
000013979273 13890725 063550 001 019 0 1
000003516356 13890725 063701 001 019 0 1
000003733700 13890725 063713 001 024 0 1
از نيمه شب تا 6 صبح است
ممكن است برخي از پرسنل در دقيقه‌‌هاي پيوسته كارت زده باشند.
و من مى‌خواهم اگر زمان كارت‌زنى يك پرسنل بار اول 04:19 دقيقه باشد و بار دوم 04:21 بار دوم را كه احتمالاً سهواً كارت زده و يا يك رفت و برگشت كوتاه بوده در نظر نگيرد.

البته خودم با دستور FETCH مشكل را حل كردم ولي اين دستور همان‌طور كه مى‌دانيد وقتي قرار باشد نزديك به 100000 ركورد مورد پردازش قرار بگيرد؛ سرعت را پايين مي‌‌آورد.

behrouzlo
سه شنبه 14 دی 1389, 11:14 صبح
با کد زیر تست کنید فکر کنم جواب بده

WITH Tbl AS (
SELECT ROW_NUMBER() OVER (ORDER BY RegRime) AS ROW
,ID
,DATE
,RegRime
FROM T
)


SELECT * FROM Tbl WHERE Row NOT IN (
SELECT T2.ROW FROM Tbl AS T1,Tbl AS T2
WHERE T1.ID = T2.ID AND T1.Date = T2.Date And DATEDIFF(MINUTE,T1.RegRime,T2.RegRime) < 5 AND T1.ROW < T2.ROW )