2011-07-28 171 views
3

我有以下我的數據庫表項的InOut需要幫助的SQL查詢

AutoId EmployeeId LogTime 
1  1   12:24 PM 
2  5   12:26 PM 
3  1   12:27 PM 
4  1   12:28 PM 
5  5   12:31 PM 

等等...

沒有我在報告中要考慮爲員工,首先(奇數項是時間),甚至同一名員工的入場時間也是超時。

總之我想下面的輸出

EmployeeId InTime OutTime 
1   12:24 PM 12:27 PM 
1   12:28 PM --- 
5   12:26 PM 12:31 PM 

那麼,如何才能做到這一點?輸出

+1

這是一種奇怪的方式來區分進出時間。 – Jacob

+0

參見第一,第三,第五項(奇數)是IN入口,第二,第四,第六個被認爲是OUT。 –

+2

你有什麼限制?即員工可以每天檢查幾次嗎?是否有錯誤,即員工是否忘記退房?員工可以過夜嗎?等等......無論如何,最好將你的案例建模爲「會話」(包括進出領域),而不僅僅是無關的時間戳 –

回答

4

這將做你想要的,但如果登錄和註銷事件之間不匹配,你將會得到錯誤的結果。你應該有一些方法來知道事件是登錄還是註銷事件。

;with cte as 
( 
    select EmployeeId, 
     LogTime, 
     row_number() over(partition by EmployeeId order by LogTime) as rn 
    from @T 
) 
select C1.EmployeeId, 
     C1.LogTime as InTime, 
     C2.LogTime as OutTime 
from cte as C1 
    left outer join cte as C2 
    on C1.EmployeeId = C2.EmployeeId and 
     C1.rn + 1 = C2.rn 
where C1.rn % 2 = 1