其中有一个包含开始和停止日志的表。在开始和停止之间,可能还有其他不同的事件事先未知。
有必要在一个单独的字段中输出,以使从开始到停止的时间为例如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
答案 0 :(得分: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 <>小提琴。
答案 1 :(得分: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
的计数大一个。然后,当该块结束时,前面的Start
和Stop
应该相等。