0

5 分ごとに記録するイベント ログがあるので、ログは次のようになります。

OK
Event1
Event1
Event1
OK
Event1
OK
Event1
Event1
Event1
OK

この場合、ステータスが返された期間の間に「OK」期間があったため、「Event1」のインスタンスが 3 つあります。

これをmySqlで処理する適切な方法はありますか? (注: Event1 / OK 以外にも定期的に表示されるステータスがあります)

実際の Sql 構造は次のようになります。

-Historical
    --CID //Unique Identifier, INT, AI
    --ID  //Unique Identifier for LOCATION, INT
    --LOCATION //Unique Identifier for Location, this is the site name, VarChar
    --STATUS //Pulled from Software event logger, VarChar
    --TIME //Pulled from Software event logger, DateTime
4

3 に答える 3

0

簡単に試してみてください。これを行うためのはるかに良い方法が欠けていると感じていますが、これでうまくいくと思います。

SELECT COUNT(*)
FROM
(
    SELECT DISTINCT a.time, b.time
    FROM Historical a
    INNER JOIN Historical b
    ON a.time < b.time
    AND a.status = 'OK'
    AND b.status = 'OK'
    INNER JOIN Historical c
    ON a.time < c.time
    AND c.time < b.time
    AND c.status = 'Event1'
    LEFT OUTER JOIN Historical d
    ON a.time < d.time
    AND d.time < b.time
    AND d.status = 'OK'
    WHERE d.cid IS NULL
) Sub1

テーブルをそれ自体に対して繰り返し結合します。エイリアス a と b は OK イベント用で、c はそれらの日付の間の任意の Event1 イベント用です。エイリアス d は a と b の間の OK イベントを探しており、見つかった場合、レコードは WHERE 句で削除されます。

次に、DISTINCT を使用して重複を取り除きます。次に、結果を数えます。

次のように単純化できる可能性があります (ただし、これを行う場合は、選択で日付を文字にキャストするのがおそらく最善です)

SELECT COUNT(DISTINCT CONCAT(a.time, b.time))
FROM Historical a
INNER JOIN Historical b
ON a.time < b.time
AND a.status = 'OK'
AND b.status = 'OK'
INNER JOIN Historical c
ON a.time < c.time
AND c.time < b.time
AND c.status = 'Event1'
LEFT OUTER JOIN Historical d
ON a.time < d.time
AND d.time < b.time
AND d.status = 'OK'
WHERE d.cid IS NULL
于 2013-06-25T13:57:38.657 に答える
0

カウントしたいのは、前のレコードが の場合のイベントのインスタンスのようですOK。これらを相関サブクエリで識別し、集計して数値を取得します。

select status, count(*)
from (select h.*,
             (select h2.status
              from historical h2
              where h2.time < h.time
              order by h2.time desc
              limit 1
             ) as prevStatus
      from historical h
     ) h
where status <> 'OK' and (prevStatus = 'OK' or prevStatus is NULL)
group by status;

どの列に と の値が含まれているかは明確ではありませOKEvent1。だと思いstatusます。また、どのような役割を果たしているのかはわかりませんがlocation、少なくともこれで始められるはずです.

于 2013-06-25T13:57:45.390 に答える