在日志表中查找开始和停止事件

问题描述 投票:0回答:2

有一个带有开始和停止日志的表。在开始和停止之间,可能有其他不同的事件事先未知。

必须在一个单独的字段中输出,以便从开始到停止为例如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
sql sql-server
2个回答
1
投票

我认为这是一个累加的总和,其中“ 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;

Here是db <>小提琴。


0
投票

我们可以在这里尝试使用窗口功能:

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的计数大一个。然后,当块结束时,前面StartStop应该相等。

© www.soinside.com 2019 - 2024. All rights reserved.