2

ステータス条件を使用して 2 つの日付の違いを見つけるクエリが必要です。

次のような私のテーブルデータ:

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は を参照しoccurencetime0は を参照しrestorationtimeます。最初の発生時間と次の対応する復元時間の差を取り、次の発生時間を取る必要があります

例えば

2011 年 10 月 22日の時点で、全部で 5occurencetime件のエントリがあり2011-10-22 09:45:00.000ます。次のエントリには、そのエントリを離れて次の 1 & 0 エントリを検索する必要があります。それから違いを作ります。restoration time2011-10-22 10:05:24.107restorationtime alone(status 0)

次のような私の最終的な結果セット:

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

私がそれをするのを手伝ってください。

4

2 に答える 2

3

ですべての行を取得してから、 を使用して次の行を取得するためにstatus = 1aを実行します。cross applystatus = 0top(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
于 2012-08-21T08:56:41.110 に答える
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
于 2012-08-21T08:44:11.230 に答える