Поиск событий Start и Stop в таблице журнала - PullRequest
0 голосов
/ 28 октября 2019

Существует таблица с журналами запуска и остановки. Между запуском и остановкой могут быть другие события, которые не известны заранее.

Необходимо вывести в отдельном поле, чтобы при запускедля остановки было, например, 1, и от остановки до начала 0

DECLARE @Mytable TABLE (
  [EventId] [int] IDENTITY(1,1) ,
  [EventName] varchar(64) ,
  [EventTime] datetime NOT NULL
)

INSERT INTO @Mytable
VALUES
('Start','2019-08-31 13:09:48.000'),
('EVENT A','2019-08-31 13:10:32.000'),
('EVENT B','2019-08-31 15:45:04.000'),
('EVENT B','2019-08-31 15:51:09.000'),
('EVENT A','2019-08-31 15:55:41.000'),
('EVENT C','2019-08-31 15:57:14.000'),
('Stop','2019-08-31 15:58:12.000'),
('EVENT D','2019-08-31 16:17:04.000'),
('EVENT E','2019-08-31 16:19:09.000'),
('EVENT W','2019-08-31 16:21:41.000'),
('EVENT Y','2019-08-31 16:27:14.000'),
('Start','2019-08-31 16:30:48.000')

SELECT * FROM @Mytable ORDER BY [EventTime]

Мои ожидания

EventId EventName   EventTime            Ex
1           Start           2019-08-31 13:09:48.000  1
2           EVENT A         2019-08-31 13:10:32.000  1
3           EVENT B         2019-08-31 15:45:04.000  1
4           EVENT B         2019-08-31 15:51:09.000  1
5           EVENT A         2019-08-31 15:55:41.000  1
6           EVENT C         2019-08-31 15:57:14.000  1
7           Stop            2019-08-31 15:58:12.000  0
8           EVENT D         2019-08-31 16:17:04.000  0
9           EVENT E         2019-08-31 16:19:09.000  0
10          EVENT W         2019-08-31 16:21:41.000  0
11          EVENT Y         2019-08-31 16:27:14.000  0
12          Start           2019-08-31 16:30:48.000  1

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Я думаю, что это кумулятивная сумма, с «1» для начала и «-1» для остановки:

select t.*,
       sum(case when eventname = 'Start' then 1
                when eventname = 'Stop' then -1
                else 0
           end) over (order by eventtime) as ex
from @mytable t
order by eventtime;

Здесь - это дб <> скрипка.

0 голосов
/ 28 октября 2019

Мы могли бы попытаться использовать оконные функции здесь:

SELECT
    EventId,
    EventName,
    EventTime,
    CASE WHEN COUNT(CASE WHEN EventName = 'Start' THEN 1 END) OVER (ORDER BY EventTime) >
              COUNT(CASE WHEN EventName = 'Stop' THEN 1 END) OVER (ORDER BY EventTime)
         THEN 1 ELSE 0 END AS Ex
FROM @Mytable
ORDER BY
    EventTime;

Хитрость в том, что первый счет Start должен быть больше, чем счет End на единицу, когда мы находимся внутри блока, которыйначался, но еще не закончился. Затем, когда блок заканчивается, должно быть равное количество предшествующих Start и Stop.

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