使用SQL检测异常间隔

Raf*_*ges 6 sql sql-server temporal-database sql-server-2008

我的问题很简单:我有一个包含一系列状态和时间戳的表(为了好奇,这些状态表示警报级别),我想查询此表以获得两种状态之间的持续时间.

看起来很简单,但这里有一个棘手的部分:我不能创建查找表,程序,它应该尽可能快,因为这个表是一个拥有超过10亿条记录的小怪物(不开玩笑!)...

架构很简单:

[pk]时间价值

(实际上,还有第二个PK,但这对此无用)

在真实世界的例子之下:

Timestamp          Status
2013-1-1 00:00:00    1
2013-1-1 00:00:05    2
2013-1-1 00:00:10    2
2013-1-1 00:00:15    2
2013-1-1 00:00:20    0
2013-1-1 00:00:25    1
2013-1-1 00:00:30    2
2013-1-1 00:00:35    2
2013-1-1 00:00:40    0

仅考虑2级警报的输出应如下所示,应报告2级警报的开始及其结束时(达到0时):

StartTime          EndTime            Interval
2013-1-1 00:00:05  2013-1-1 00:00:20     15
2013-1-1 00:00:30  2013-1-1 00:00:40     10

我一直在尝试各种各样的内部连接,但是所有这些都引导我进行了一次惊人的笛卡尔爆炸.你能帮助我找到一种方法来实现这个目标吗?

谢谢!

sge*_*des 4

这一定是我今天看到的更难的问题之一 - 谢谢!我假设你可以使用 CTE?如果是这样,请尝试这样的事情:

;WITH Filtered
AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY dateField) RN, dateField, Status
    FROM Test    
)
SELECT F1.RN, F3.MinRN,
    F1.dateField StartDate,
    F2.dateField Enddate
FROM Filtered      F1, Filtered F2, (
SELECT F1a.RN, MIN(F3a.RN) as MinRN
FROM Filtered      F1a
   JOIN Filtered F2a ON F1a.RN = F2a.RN+1 AND F1a.Status = 2 AND F2a.Status <> 2
   JOIN Filtered F3a ON F1a.RN < F3a.RN AND F3a.Status <> 2
GROUP BY F1a.RN ) F3 
WHERE F1.RN = F3.RN AND F2.RN = F3.MinRN
Run Code Online (Sandbox Code Playgroud)

还有小提琴。我没有添加间隔,但我想您可以从这里处理该部分。

祝你好运。