एक दोस्त की मदद से, मैंने प्वाइंट # 2 . में उल्लिखित समस्या को हल किया :नीचे दिए गए चरणों से, जैसा कि मैं केवल sql स्क्रिप्ट में समाधान चाहता था, अपने छोटे sql ज्ञान के साथ मैंने 3 चरणों में समाधान तैयार किया, मुझे यकीन है कि इसे विशेषज्ञों द्वारा सरल तरीके से नियंत्रित किया जा सकता है:
आधार तालिका को EMP_DATA मानते हुए, मैंने एक अस्थायी तालिका का उपयोग किया:Temp_1आधार तालिका के लिए मैंने अंतिम चरण में रिकॉर्ड को फ़्लैग करने के लिए "वैधता" फ़ील्ड जोड़ा है।
EMP_DATA:
EMPID EVENT_TYPE Swipe_time VALIDITY
1 EN1 2012-06-01 12:00
1 EX 2012-06-01 12:30
2 EN1 2012-06-01 12:50
1 EN2 2012-06-01 13:10
1 EN2 2012-06-01 15:50
2 EX 2012-06-01 13:30
2 EN1 2012-06-01 14:00
2 EX 2012-06-02 19:00
1 EX 2012-06-02 19:30
चरण1:
नीचे दी गई क्वेरी EMP_DATA में पंक्तियों के लिए पंक्ति संख्या निर्दिष्ट करेगी और उन्हें temp_1 तालिका में कॉपी करेगी:
create table Temp_1 (EMP_ID int, Event_Type char(10), Swipe_Time datetime, rownum int, Lastevent char(10), Nextevent char(10))
Insert into Temp_1
SELECT EMP_ID, EVENT_TYPE,
ROW_NUMBER() OVER ( PARTITION BY EMP_ID
ORDER BY SWIPE_TIME ) AS RowNumber
FROM EMP_DATA
चरण 1 आउटपुट:
EMPID EVENT_TYPE Swipe_time RowNumber LastEvent NextEvent
1 EN1 2012-06-01 12:00 1
1 EX 2012-06-01 12:30 2
2 EN1 2012-06-01 12:50 1
1 EN2 2012-06-01 13:10 3
1 EN2 2012-06-01 15:50 4
2 EX 2012-06-01 13:30 2
2 EN1 2012-06-01 14:00 3
2 EX 2012-06-02 19:00 4
1 EX 2012-06-02 19:30 5
चरण2:
temp_1 तालिका की पंक्ति में प्रत्येक घटना के लिए अंतिम घटना (पिछली घटना) और अगले घटना की पहचान करें
Update main set main.LastEvent =yy.LEvent,main.NextEvent=yy.NEvent
from TEMP_1 main
inner join
( SELECT A.EMP_ID , A.EVENT_TYPE, A.SWIPE_TIME, A.ROWNUMBER
COALESCE(LastVal.ZONE_NAME, 'N/A') AS LEvent ,
COALESCE(NextVal1.ZONE_NAME, 'N/A') AS NEvent
FROM Temp_1 A
LEFT JOIN Temp_1 LastVal
ON A.EMP_ID= LastVal.EMP_ID
AND A.ROWNUMBER - 1 = LastVal.ROWNUMBER
LEFT JOIN Temp_1 NextVal1
ON A.EMP_ID= NextVal1.EMP_ID
AND A.ROWNUMBER + 1 = NextVal1.ROWNUMBER)yy
on main.EMP_ID=yy.EMP_ID,
and main.event_type=yy.event_type
and main.swipe_time = yy.swipe_event
चरण 2 आउटपुट:
EMPID EVENT_TYPE Swipe_time RowNumber LastEvent NextEvent
1 EN1 2012-06-01 12:00 1 N/A EX
1 EX 2012-06-01 12:30 2 EN1 EN2
2 EN1 2012-06-01 12:50 1 N/A EX
1 EN2 2012-06-01 13:10 3 EX EN2
1 EN2 2012-06-01 15:50 4 EN2 EX
2 EX 2012-06-01 13:30 2 EN1 EN1
2 EN1 2012-06-01 14:00 3 EX EX
2 EX 2012-06-02 19:00 4 EN1 N/A
1 EX 2012-06-02 19:30 5 EN2 N/A
चरण 3:
LastEvent और NextEvent के आधार पर हम टेलगेट की गई प्रविष्टियों की पहचान कर सकते हैं और मुख्य तालिका EMP_DATA को निम्न क्वेरी द्वारा अपडेट कर सकते हैं:
Update emp set emp.VALIDITY='N'
from EMP_DATA
INNER JOIN
(select *
from TEMP_1
where (EVENT_TYPE = 'EX' and LastEvent = 'EX')
or (EVENT_TYPE IN ('EN1','EN2') and NextEvent IN ('EN1','EN2')))yy
ON emp.EMP_ID = yy.EMP_ID
and emp.EVENT_TYPE = yy.EMP_ID
and emp.Swipe_time = yy.Swipe_time
अंतिम आउटपुट: *चरण 3 आउटपुट: * पी>
EMPID EVENT_TYPE Swipe_time VALIDITY
1 EN1 2012-06-01 12:00
1 EX 2012-06-01 12:30
2 EN1 2012-06-01 12:50
1 EN2 2012-06-01 13:10 N
1 EN2 2012-06-01 15:50
2 EX 2012-06-01 13:30
2 EN1 2012-06-01 14:00
2 EX 2012-06-02 19:00
1 EX 2012-06-02 19:30