SKIP在时间戳列中超过30分钟

时间:2016-06-02 13:47:42

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

我有一个时间序列,我需要生成没有大间隙的时间间隔子集(任何大于30分钟的间隔都是一个很大的间隙)。这是SQL 2008,因此我无法使用Lead() / Lag()函数。

每当有一个至少30分钟的间隙时,我需要一个新的行,下一个"大的无间隙"间隔。例如,如果没有大的间隙,则结果将是一行,其中包含时间戳的minmax。如果有1'大'差距,将有2行 - 从系列的开始到间隙,从间隙到结束。如果有更多的间隙,我们会在间隙之间的每个间隔获得行等。

输入:timestamp

2015-07-15 15:01:21
2015-07-15 15:17:44
2015-07-15 15:17:53
2015-07-15 15:18:34
2015-07-15 15:21:41
2015-07-15 15:58:12
2015-07-15 15:59:12
2015-07-15 16:05:12
2015-07-15 17:02:12

期望的输出:

      from          |        to
--------------------+-------------------
2015-07-15 15:01:21 | 2015-07-15 15:21:41
2015-07-15 15:58:12 | 2015-07-15 16:05:12
2015-07-15 17:02:12 | 2015-07-15 17:02:12

非常感谢 - 我一直在努力工作几天没有运气,我的光标解决方案太慢了。

1 个答案:

答案 0 :(得分:1)

这是一个使用row_number作为前导和延迟的便捷替代

的示例
;WITH CTE AS (SELECT *, row_number() OVER(order by LogTime) rown from isproclog)
select logtime from cte WHERE NOT EXISTS 
            (SELECT 0 FROM cte cte2 
                        WHERE 
                            CTE2.LogTime < CTE.LogTime 
                            AND 
                            CTE2.LogTime >= DATEADD("mi",-30, CTE.LogTime)
            )
UNION SELECT MIN(LogTime) FROM CTE 
UNION SELECT MAX(LogTime) FROM CTE ORDER BY LogTime