在SQL Server中设置输入和输出时间扫描

时间:2016-11-21 07:01:08

标签: sql-server-2008 select

enter image description here我有一个SQL Server表,其中包含所有用户的滑动信息,包括Userid,滑动日期,部门ID。我需要设置第一次滑动时间,第二次滑动时间,第三次滑动时间,第四次滑动时间等等(一天内)。

对于前两次滑动,一次必须是In Time,其他必须是一行中的Out time。接下来两次滑动为下一行的In Time和Out Time。

如何使用SQL查询?如果只有奇数次的滑动设置为空。

怎么可能?

给出表

UserId      Date                         DeptId
1001        2016-11-20 09:50:46            2
1001        2016-11-20 11:10:26            2
1001        2016-11-20 12:10:10            2
1001        2016-11-20 16:10:30            2
1002        2016-11-20 10:00:00            5
1002        2016-11-20 14:00:00            5
1002        2016-11-20 14:30:00            5

预期产出

UserId       InTime                 OutTime            DeptId

1001        2016-11-20 09:50:46   2016-11-20 11:10:26    2
1001        2016-11-20 12:10:10   2016-11-20 16:10:30    2
1002        2016-11-20 10:00:00   2016-11-20 14:00:00    5
1002        2016-11-20 14:30:00   NULL                   5

由于

3 个答案:

答案 0 :(得分:0)

尝试以下查询

select UserId, in_time, out_time, DeptId 
from(    
    select UserId, 
           swipetime in_time, 
           lead(swipetime) over(order by UserId) out_time, 
           DeptId, 
           ROW_NUMBER() over(partition by UserId order by UserId) row_num
    from table1) as cte    
where row_num % 2 != 0

希望这可以帮助你。

答案 1 :(得分:0)

像这样的东西会把你的记录放到数字桶0和1中。然后你用它来交叉出来

SELECT 
UserId,Date,DeptId, 
DENSE_RANK() OVER (PARTITION BY DeptId, UserId ORDER BY Date) % 2 AS InOut
FROM Table1
ORDER DeptId, UserId, DeptId

尝试并确认in为0且out为1然后我可以帮助你交叉它

我必须再次提到,这种东西有各种各样的边缘情况,即双重滑动,意外滑动,横扫午夜等。

答案 2 :(得分:0)

可能会有双重滑动,意外滑动和夜班滑动可能会导致我的上述功能出现如此多问题,例如Mr.Nick.McDermaid建议。所以我必须将上述功能改为其他方式。非常感谢Nick.McDermaid和Viki888回答我的问题。