3

警報システムのログを含むデータベースがあるとします。間隔を置いて、データベースに新しい行が挿入されます。この行には、alarm_id、日時、およびアラームがオンかオフかを示すフラグがあります。

一定期間 (今日、今週、今月) にアラームがオン (武装 = 1) に設定されている時間を知りたいです。これは、armed=1 を持つ後続の行になります。armed=0 の行がある場合、カウントされない場合があります。

例えば:

id      alarm_id        armed       date        
1       1               0           2012-01-01 00:00:00
2       1               1           2012-01-01 00:10:00
3       1               1           2012-01-01 00:20:10
4       1               1           2012-01-01 00:29:58
5       1               0           2012-01-01 00:40:00
6       1               1           2012-01-01 01:00:00
7       1               1           2012-01-01 01:10:00
8       1               1           2012-01-01 01:20:00
9       1               0           2012-01-01 01:30:00

この例では、アラームは 00:10:00 から 00:29:58 => 19:58 分に設定されました。そして、1:00:00 から 1:20:00 までの武装 => 20 分。この日は、少なくとも 39:58 分間アラームが作動しており、それが私のクエリの結果である必要があります。

ログはハートビートのようなものなので、「オン」と「オフ」の状態の間でアラームを作動させることができますが、後続のどの行が作動するかを知りたいだけです = 1.

私はこれについて頭を悩ませてきました。テーブル自体に参加しましたが、これを行う方法がわかりません。それは可能ですか?データを操作するために SQL Fiddle を設定しました: http://sqlfiddle.com/#!2/9eca2/2/0

ありがとう。

4

1 に答える 1

2

単一のクエリを使用して MySQL でこれを行うには、次のようなものを使用する必要があります。

SELECT armed_at INTO @v FROM alarm ORDER BY armed_at LIMIT 1;

SELECT armed, TIMEDIFF(armed_at, @v), @v:=armed_at FROM alarm;

詳細については、次を試してください。

SET @t =0;
SELECT armed_at INTO @v FROM alarm ORDER BY armed_at LIMIT 1;
SELECT armed, 
       IF(armed = 1, @t:=ADDTIME(TIME(TIMEDIFF(armed_at, IF(@v <> 0, @v, armed_at))), @t) , @t:=0) AS time, 
       IF(armed = 1, @v:=armed_at, @v := 0) AS v 
FROM alarm;

更新されたクエリにより、必要な正確な結果が得られます。試してください:

SET @a=0, @d=0, @t=0;

SELECT atime
FROM (
      SELECT id, armed,
             IF((@a = 1 AND armed = 1), @t:=ADDTIME(TIME(TIMEDIFF(adate, IF(@d <> 0, @d, adate))), @t) , 0) AS atime,
             IF((@a:=armed) = 1, @d:=adate, @d := 0) AS d
      FROM alarmlog
     ) a
WHERE a.armed = 1
ORDER BY id DESC
LIMIT  1;
于 2012-07-20T09:17:21.477 に答える