在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
答案 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 的。不妨在报告中打印出来;它会让你的工作更轻松。