如何在SQL中执行此操作?(在窗口上运行查询,而不仅仅是一个汇总)



假设我有一些数据戳记yyyy/mm/dd hh:mm:ss和一些错误阶段(1表示错误)。我将加载的数据加载在数据框中,我要调用DF,并希望根据时间戳和error_state计算time_to_to_next_error(以秒为单位进行测量)。

Timestamp            Error_State  Time_To_Next_Error   
2017-05-10 00:10:50      0                10
2017-05-10 00:10:55      0                5 
2017-05-10 00:11:05      1                0
2017-05-10 00:11:10      0                5 
2017-05-10 00:11:15      1                0
2017-05-10 00:11:20      0                15
2017-05-10 00:11:25      0                10
2017-05-10 00:11:30      0                5
2017-05-10 00:11:20      1                0
2017-05-10 00:11:20      0                0 

例如,第一个观察,第一个错误在11:05发生之前有15秒,然后计数从0秒开始,然后开始下一个"窗口"。

是否有一种方法可以定义一个跨越下一个说5行的"窗口",以便我可以'向前'并检查这5行是否满足某些条件(例如,其中一个值为1是1表示error_stage= 1很快就会发生)

也许是这样的东西:

SELECT 
  *,
  DATEDIFF(second,
    timestamp,
    MIN(CASE WHEN error > 0 THEN timestamp END) OVER(ORDER BY timestamp ROWS BETWEEN 1 FOLLOWING AND 5 FOLLOWING
  ) as ttne 
FROM yourtable

这将在以下5行中获得最低(最快)的时间戳

您可以在执行其他逻辑

时调整情况
--time to next error code 1
MIN(CASE WHEN error = 1 THEN ...

如果在接下来的5行中没有错误代码1,则应导致null,并且日期还应输出null

正是您要说的 - 窗口函数!

这是一些代码,SQL Server样式:

DECLARE @tbl TABLE (
ts datetime,
Error_st int
);
INSERT INTO @tbl 
VALUES 
('2017-05-10 00:10:50',      0),
('2017-05-10 00:10:55',      0),
('2017-05-10 00:11:05',      1),
('2017-05-10 00:11:10',      0),
('2017-05-10 00:11:15',      1),
('2017-05-10 00:11:20',      0),
('2017-05-10 00:11:25',      0),
('2017-05-10 00:11:30',      0),
('2017-05-10 00:11:35',      1),
('2017-05-10 00:11:40',      0)
select *, DATEDIFF(second, ts, 
                    min(CASE WHEN error_st=1 then ts else NULL END) 
                    over (order by ts desc)) as time_to_Next_Err
--  , min(CASE WHEN error_st=1 then ts else NULL END) 
--    over (order by ts desc) as NextErrorTS
from @tbl
order by ts

在这里,我们依赖于MIN()的SQL Server窗口的默认行为:窗口定义为"所有先前的行和当前"(通过降序时间戳进行订购)。您可以控制窗口并将其限制为" 5个先前",如果您只想显示"近距离"情况。

更多详细信息在这里:https://learn.microsoft.com/en-us/sql/t-sql/queries/select-ober-clause-transact-sql

相关内容

最新更新