我有一个时间序列,我需要生成没有大间隙的时间间隔子集(任何大于30分钟的间隔都是一个很大的间隙)。这是SQL 2008,因此我无法使用Lead()
/ Lag()
函数。
每当有一个至少30分钟的间隙时,我需要一个新的行,下一个"大的无间隙"间隔。例如,如果没有大的间隙,则结果将是一行,其中包含时间戳的min
和max
。如果有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
非常感谢 - 我一直在努力工作几天没有运气,我的光标解决方案太慢了。
答案 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