1

日時スタンプとステータス変更フラグ (0 または 1) の行を出力する SQL があります。

フラグが0になる最初のレコードからステータスフラグが1に変わるまでのタイムスパンを取得し、フラグがまだ1のときにレコードを無視し、0に戻ってからタイムスパンを取得する必要があります。最後の記録。状態変更フラグは、0 と 1 の間で何回でも反転する可能性があります。

したがって、ステータス変更フラグを前の行と比較して、日時スタンプの差を蓄積し続ける必要があるかどうかを判断できる必要があります。

私はカーソルの作成を検討してきましたが、カーソルがいかに非効率的であるかについて読み続けています。

これが意味をなすことを願っています。

4

2 に答える 2

1
DECLARE @test TABLE ([group] int,t DateTime,[status] bit)

INSERT INTO @test values (1,'20130101 11:11:11',0)
INSERT INTO @test values (1,'20130101 11:11:12',0)
INSERT INTO @test values (1,'20130101 11:11:13',0)
INSERT INTO @test values (1,'20130101 11:11:14',1)
INSERT INTO @test values (1,'20130101 11:11:15',1)
INSERT INTO @test values (1,'20130101 11:11:16',1)
INSERT INTO @test values (1,'20130101 11:11:17',0)
INSERT INTO @test values (1,'20130101 11:11:18',0)
INSERT INTO @test values (1,'20130101 11:11:19',0)


Select [Group],MIN(t)

,(Select MAX(t) from @test t2 where [status]=0 and t2.[group]=t.[group] and Exists(Select * from @test t3 where [status]=1 and t3.[group]=t.[group] and  t3.t<t2.t))
,DateDiff(ss,MIN(t)
,(Select MAX(t) from @test t2 where [status]=0 and t2.[group]=t.[group] and Exists(Select * from @test t3 where [status]=1 and t3.[group]=t.[group] and  t3.t<t2.t))
) as Seconds
from @test t where Status=0
group by [group]
于 2013-04-08T14:17:04.680 に答える
0

このようなものがうまくいくと思います。ただし、テーブル構造に関する詳細情報が必要になる場合があります

WITH FirstFlag(FlagType, FlagTime)
AS
(
    SELECT 
        FlagType
        , min(DateCreated) as FlagTime
    FROM TheTable
    WHERE Flag = 0
)
, SecondFlag(FlagTime1, FlagTime2)
AS
(
    SELECT 
        F.FlagTime as FlagTime
        , min(T.DateCreated) as FlagTime
    FROM TheTable as T
        INNER JOIN FirstFlag as F
            ON T.FlagType = F.FlagType
    WHERE Flag = 1
        AND T.DateCreated > F.FlagTime
)
SELECT datediff(min, FlagTime1, FlagTime2)
FROM SecondFlag
于 2013-04-08T14:20:03.080 に答える