我需要一个查询来查找状态条件
的两个日期之间的差异我的表数据如下:
select
ROW_NUMBER() OVER (ORDER BY eventtime) as id,
Eventcode, eventtime, status
from cfw.dbo.DCTBLEVENTINFO
where
MeterID = 4722
and EventTime >= '2011-10-21' and EventCode = 13
数据:
id Eventcode eventtime status
1 13 2011-10-21 21:42:00.000 1
2 13 2011-10-21 22:02:24.107 0
3 13 2011-10-22 09:45:00.000 1
4 13 2011-10-22 10:05:24.107 0
5 13 2011-10-22 15:08:00.000 0
6 13 2011-10-22 16:33:00.000 1
7 13 2011-10-22 16:44:00.000 0
8 13 2011-10-22 16:53:24.107 0
9 13 2011-10-23 08:52:00.000 1
10 13 2011-10-23 09:12:24.107 0
11 13 2011-10-23 10:18:00.000 0
12 13 2011-10-23 10:35:00.000 1
13 13 2011-10-23 10:36:00.000 0
14 13 2011-10-23 10:55:24.107 0
15 13 2011-10-23 10:56:00.000 1
16 13 2011-10-23 11:01:00.000 0
17 13 2011-10-23 11:16:24.107 0
18 13 2011-10-23 18:28:00.000 1
19 13 2011-10-23 18:30:00.000 0
在此状态列中, 1 表示occurencetime
, 0 表示restorationtime
。我必须在第一次出现时间和下一个相应的恢复时间之间取差异,然后进行下一次发生时间
for ex
对于 2011-10-22总共5 条目的日期,我必须将occurencetime
作为2011-10-22 09:45:00.000
和restoration time
作为{{1并且有所作为。下一个条目有2011-10-22 10:05:24.107
我必须离开该条目并搜索下一个1& 0条目。然后有所作为。
我的最终结果如下:
restorationtime alone(status 0)
帮助我做到这一点。
答案 0 :(得分:3)
试试这个:
;with cte as (
select ROW_NUMBER() OVER (ORDER BY eventtime) as id,
Eventcode, eventtime, status
from cfw.dbo.DCTBLEVENTINFO
where MeterID = 4722
and EventTime >= '2011-10-21' and EventCode = 13)
select c1.Eventcode,
c1.eventtime as occurencetime,
min(c2.eventtime) as restorationtime,
datediff(ss,c1.eventtime,min(c2.eventtime)) as difference
from cte c1
left outer join cte c2
on c1.eventtime < c2.eventtime
and c1.Eventcode=c2.Eventcode
where c1.status=1
and c2.status=0
group by c1.Eventcode,c1.eventtime
答案 1 :(得分:3)
获取status = 1
的所有行,然后cross apply
使用status = 0
top(1) ... order by
获取下一行。
select T1.EventCode,
T1.EventTime as OccurenceTime,
T3.RestorationTime,
datediff(second, T1.EventTime, T3.RestorationTime) as "Difference(sec)"
from cfw.dbo.DCTBLEVENTINFO as T1
cross apply (
select top(1) T2.EventTime as RestorationTime
from cfw.dbo.DCTBLEVENTINFO as T2
where T2.EventTime > T1.EventTime and
T2.Status = 0 and
T2.MeterID = T1.MeterID and
T2.EventCode = T1.EventCode
order by T2.EventTime
) as T3
where T1.Status = 1 and
T1.MeterID = 4722 and
T1.EventTime >= '20111021' and
T1.EventCode = 13
结果:
EventCode OccurenceTime RestorationTime Difference(sec)
----------- ----------------------- ----------------------- ---------------
13 2011-10-21 21:42:00.000 2011-10-21 22:02:24.107 1224
13 2011-10-22 09:45:00.000 2011-10-22 10:05:24.107 1224
13 2011-10-22 16:33:00.000 2011-10-22 16:44:00.000 660
13 2011-10-23 08:52:00.000 2011-10-23 09:12:24.107 1224
13 2011-10-23 10:35:00.000 2011-10-23 10:36:00.000 60
13 2011-10-23 10:56:00.000 2011-10-23 11:01:00.000 300
13 2011-10-23 18:28:00.000 2011-10-23 18:30:00.000 120