Именно то, что вы говорите - оконная функция!
Вот некоторый код в стиле 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
Здесь мы полагаемся на стандартное поведение окна SQL Server.версия MIN()
: окно определяется как «все предыдущие строки и текущие» (упорядочение по убыванию отметки времени).Вы можете управлять окном и ограничивать его «5 предыдущими», если вы хотите показывать только ситуации, близкие к ошибке.
Подробнее здесь: https://docs.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql