2011-07-28 143 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