我有一组带有I或O类型(输入或输出)的时间戳(SQL 2012),如下面的示例数据:
我需要将“状态”列设置为INACTIVE到相同类型(输入或输出)的连续时间,它们之间的间隔小于120秒。该连续组中的第一个时间戳将不会获得任何状态。
在图像中,您可以看到它应该如何工作。
我有大约80,000条记录需要分析并设置INACTIVE标志,其中条件匹配。这应该在存储过程中完成。
更新这里是可以用于测试的SQL脚本
答案 0 :(得分:1)
您应该可以使用lag()
和一些逻辑轻松完成此操作。 select
形式的查询是:
select t.*,
(case when datediff(second,
lag(TimeStamp) over (partition by EntranceType Order by TimeStamp),
TimeStamp) < 120
then 'InActive'
end) as NewColumnStatus
from timestamp_01 t;
如果要进行更新,可以使用可更新的CTE:
with toupdate as (
select t.*,
(case when datediff(second,
lag(TimeStamp) over (partition by EntranceType Order by TimeStamp),
TimeStamp) < 120
then 'InActive'
end) as NewColumnStatus
from timestamp_01 t
)
update toupdate
set Status = NewColumnStatus;
编辑:
employee_id
应该很容易添加:
with toupdate as (
select t.*,
(case when datediff(second,
lag(TimeStamp) over (partition by employee_id, EntranceType Order by TimeStamp),
TimeStamp) < 120
then 'InActive'
end) as NewColumnStatus
from timestamp_01 t
)
update toupdate
set Status = NewColumnStatus;