sql - 使用 SQL 检测异常间隔

标签 sql sql-server sql-server-2008 temporal-database

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

看起来很简单,但棘手的部分来了:我无法创建查找表、过程,而且它应该尽可能快,因为这个表是一个保存超过 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/

相关文章:

vb.net - 如何最好地加密/解密 SQL Server 数据以防止开发人员看到它?

sql - 从 SQL Server 2008 表中的起始值和结束值创建一个序列?

sql - PostgreSQL LIKE 查询性能变化

mysql - 从多个表中选择 - 一对多关系

sql - 如何检查某些表是否为空?

SQL 日期比较

mysql - 基于参数的条件 WHERE 语句?

sql-server - Node MSSQL "TypeError: req.query is not a function"错误

sql - IF EXISTS 在 INSERT、UPDATE、DELETE 之前进行优化

SQL 查询不使用可用索引 (SQL Server 2008)