让员工进/出'状态基于'进入/退出'柱

时间:2017-08-14 20:04:53

标签: sql-server

在SQL Server中,如何让员工进/出'状态基于'进/出'柱?例如,如果员工的最后一条记录是'输入',那么他就是' in'。如果最后一条记录是'退出',那么他就是' out'。对于id = 111,in_out应该是' in'并且id = 222应该是' out'

+-----+---------------------+------------+
| id  |      timestamp      |   status   |
+-----+---------------------+------------+
| 111 | 01/01/2017 07:00:10 | enter      |
| 222 | 01/01/2017 01:10:29 | enter      |
| 111 | 01/01/2017 18:20:17 | exit       |
| 111 | 01/02/2017 08:20:34 | enter      |
| 333 | 01/02/2017 06:20:11 | enter      |
| 222 | 01/02/2017 10:10:47 | exit       |
+-----+---------------------+------------+

我知道我应该使用case语句,但以下代码不会起作用

select id, case   
       when status = 'enter' then 'in'  
       when status = 'exit' then 'out'  
       else 'n/a'  
       end as in_out  
from table1  

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以查询如下:

Select Id, case when [status] = 'enter' then 'in' else 'out' end as In_out 
   from (
    Select *, RowN = row_number() over(partition by id order by [timestamp] desc) from #timedata
) a Where a.RowN = 1

输出如下:

+-----+--------+
| Id  | In_out |
+-----+--------+
| 111 | in     |
| 222 | out    |
| 333 | in     |
+-----+--------+

答案 1 :(得分:0)

诀窍是在每个输入后找到第一个退出

select in.id,
       case coalesce(min(out.status), in.status)
       when 'enter' then 'in'
       when 'exit'  then 'out'
       else 'n/a' -- I suggest: coalesce(out.status, in.status) + '??'
       end as 'status'
from table1 as in
left
 join table1 as out
on in.id = out.id
and in.timestamp <= out.timestamp
and in.status = 'enter'
and out.status = 'exit'
group by in.id, in.status

此查询为每个{id,timestamp} 输入对找到最小退出。它假定在​​进入之前没有出口(建筑物中没有人)。这需要单独验证。

每当我为这样的报告挖掘数据时,我尽量不要压制意外的输入,而是让它流过。如果您将输入退出的所有内容转换为 n / a ,那么在某些时候您将不得不找出生产这些内容的内容 N / A 的。不妨在报告中打印出来;它会让你的工作更轻松。