如何识别间隙小于X秒的连续时间

时间:2014-04-28 00:58:59

标签: sql sql-server sql-server-2008

我有一组带有I或O类型(输入或输出)的时间戳(SQL 2012),如下面的示例数据:

enter image description here

我需要将“状态”列设置为INACTIVE到相同类型(输入或输出)的连续时间,它们之间的间隔小于120秒。该连续组中的第一个时间戳将不会获得任何状态。

在图像中,您可以看到它应该如何工作。

我有大约80,000条记录需要分析并设置INACTIVE标志,其中条件匹配。这应该在存储过程中完成。

更新这里是可以用于测试的SQL脚本

http://sqlfiddle.com/#!6/9c9e7/2

1 个答案:

答案 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;