我的问题很简单:我有一个包含一系列状态和时间戳的表(出于好奇,这些状态表示警报级别),我想查询该表以获得两个状态之间的持续时间。
看起来很简单,但棘手的部分来了:我无法创建查找表、过程,而且它应该尽可能快,因为这个表是一个保存超过 10 亿条记录的小怪物(不是开玩笑!)。 ..
架构非常简单:
[pk] 时间 值(value)
(其实还有第二次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
我一直在尝试各种内部连接,但所有这些都让我得到了惊人的笛卡尔爆炸。你们能帮我想出一种方法来实现这个目标吗?
谢谢!
最佳答案
这一定是我今天看到的更难的问题之一 - 谢谢!我假设你可以使用 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
还有Fiddle 。我没有添加间隔,但我想您可以从这里处理该部分。
祝你好运。
关于sql - 使用 SQL 检测异常间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14509397/