1

2 分ごとにチェックするログ テーブルの期間を計算しようとしています。アラートがある場合はアラートが入力されます。簡略化されたテーブル形式は次のとおりです。

RuleID   TimeStamp  
1        2013-04-10 08:40
1        2013-04-10 08:42
1        2013-04-10 08:44
2        2013-04-10 08:40
2        2013-04-10 08:42
1        2013-04-10 09:40
1        2013-04-10 09:42

私が探している結果は次のとおりです。

RuleID   EarliestTimeStamp   LatestTimeStamp   DurationInMins
1        2013-04-10 08:40    2013-04-10 08:44  4
2        2013-04-10 08:40    2013-04-10 08:42  2
1        2013-04-10 09:40    2013-04-10 09:42  2

ご覧のとおり、ルールは全体で複数回ログに記録できます。2 分以上の休憩がある場合、それは新しいイベントとしてカウントされ、新しい結果エントリになります。

必要に応じて詳細を提供できますが、残念ながら、使用するデータセットを提供できません。

4

2 に答える 2

0
declare @Table1 table
    ([RuleID] int, [TimeStamp] smalldatetime)
;

INSERT INTO @Table1
    ([RuleID], [TimeStamp])
VALUES
    (1, '2013-04-10 08:40'),
    (1, '2013-04-10 08:42'),
    (1, '2013-04-10 08:44'),
    (2, '2013-04-10 08:40'),
    (2, '2013-04-10 08:42'),
    (1, '2013-04-10 09:40'),
    (1, '2013-04-10 09:42')
;

select distinct t1.RuleID, t1.Timestamp EarliestTimeStamp,a.LatestTimeStamp, datediff(minute, t1.Timestamp, a.LatestTimeStamp) DurationInMins 
from @Table1 t1
outer apply
(select min(timestamp) LatestTimeStamp from @Table1 t2 
where t1.timestamp <= timestamp and t1.ruleid = ruleid and not exists (select 1 from @table1 where t1.ruleid = ruleid and timestamp > t1.timestamp and timestamp > t2.timestamp and timestamp <= dateadd(minute, 2, t2.timestamp)))a
where not exists(select 1 from @Table1 where timestamp < t1.timestamp and timestamp >= dateadd(minute,-2,t1.timestamp)
and t1.RuleId = RuleId)
于 2013-06-14T08:23:32.473 に答える
0

金曜日の午後、素敵な頭の体操をありがとう。これが私が思いついたものです:

;WITH s AS
(SELECT t1.RuleID, t1.TimeStamp AS StartTime from Table1 t1
LEFT JOIN Table1 t2 ON
t1.RuleID = t2.RuleID and dateadd(minute, 2, t2.TimeStamp) = t1.TimeStamp
WHERE t2.TimeStamp IS NULL)
,e AS
(SELECT t1.RuleID, t1.TimeStamp AS EndTime from Table1 t1
LEFT JOIN Table1 t2 ON
t1.RuleID = t2.RuleID and dateadd(minute, -2, t2.TimeStamp) = t1.TimeStamp
WHERE t2.TimeStamp IS NULL)
SELECT s.RuleID, s.StartTime, e1.EndTime, datediff(minute, s.StartTime, e1.EndTime) AS DiffInMins FROM s INNER JOIN e AS e1
ON s.RuleID = e1.RuleID AND s.StartTime < e1.EndTime
AND e1.EndTime = (SELECT MIN(EndTime) FROM e AS e2 WHERE e2.RuleID = e1.RuleID AND s.StartTime < e2.EndTime)

結果は次のとおりです。

| RULEID |                    STARTTIME |                      ENDTIME | DIFFINMINS |
-------------------------------------------------------------------------------------
|      1 | April, 10 2013 08:40:00+0000 | April, 10 2013 08:44:00+0000 |          4 |
|      2 | April, 10 2013 08:40:00+0000 | April, 10 2013 08:42:00+0000 |          2 |
|      1 | April, 10 2013 09:40:00+0000 | April, 10 2013 09:42:00+0000 |          2 |

SQL フィドル

于 2013-06-14T04:13:11.803 に答える