gpt4 book ai didi

sql - 使用 SQL 检测异常间隔

转载 作者:行者123 更新时间:2023-12-02 20:43:13 25 4
gpt4 key购买 nike

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

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

架构非常简单:

[pk] 时间值(value)

(其实还有第二次pk但是没用)

下面是一个现实世界的例子:

Timestamp          Status2013-1-1 00:00:00    12013-1-1 00:00:05    22013-1-1 00:00:10    22013-1-1 00:00:15    22013-1-1 00:00:20    02013-1-1 00:00:25    12013-1-1 00:00:30    22013-1-1 00:00:35    22013-1-1 00:00:40    0

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

StartTime          EndTime            Interval2013-1-1 00:00:05  2013-1-1 00:00:20     152013-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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com