Как это сделать в SQL? (выполнить запрос через окно вместо одного агрегата) - PullRequest
1 голос
/ 15 марта 2019

Допустим, у меня есть некоторые данные с отметками времени гггг / мм / дд чч: мм: сс и некоторыми этапами ошибки (1 означает, что произошла ошибка).Я загрузил данные в фрейм данных, который я вызываю df, и хочу вычислить Time_To_Next_Error (измеряется в секундах) в новом столбце Time_To_Error на основе метки времени и Error_State.

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 

Например, первое наблюдение, за 15 секунд до появления первой ошибки в 11:05, после чего отсчет начинается с 0 секунд, после чего начинается следующее «окно».

Есть ли способ определить «окно», охватывающее следующие, скажем, 5 строк, чтобы я мог «заглянуть в будущее» и проверить, удовлетворяет ли какая-либо из этих 5 строк некоторому условию (например, скажем, одно из значений равно 1, что означает Error_Stage = 1скоро будет)

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

Возможно, что-то вроде этого:

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 строках, где встречающийся код ошибки больше 0, и датирует ее временной меткойтекущая строка

Вы можете настроить случай, когда делать другую логику

--time to next error code 1
MIN(CASE WHEN error = 1 THEN ...

Если в следующих 5 строках нет кода ошибки 1, это должно привести к нулю, а дата должна такжезатем выведите ноль

1 голос
/ 15 марта 2019

Именно то, что вы говорите - оконная функция!

Вот некоторый код в стиле 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...