假设我有一些数据戳记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