0

私はこのようなテーブルを持っています:

CREATE TABLE `hoststatus` (
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `host` varchar(100) NOT NULL,
  `result` tinyint(1) NOT NULL,
  PRIMARY KEY (`timestamp`,`host`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `hoststatus` (`timestamp`, `host`, `result`) VALUES
('2012-06-08 14:18:01', 'host1', 0),
('2012-06-08 14:19:01', 'host1', 0),
('2012-06-08 14:20:01', 'host1', 1),
('2012-06-08 14:21:01', 'host1', 1),
('2012-06-08 14:22:01', 'host1', 1),
('2012-06-08 14:23:01', 'host1', 1),
('2012-06-08 14:24:01', 'host1', 0),
('2012-06-08 14:25:01', 'host1', 0),
('2012-06-08 14:26:01', 'host1', 0),
('2012-06-08 14:27:01', 'host1', 0),
('2012-06-08 14:28:01', 'host1', 1),
('2012-06-08 14:29:01', 'host1', 1),
('2012-06-08 14:29:04', 'host2', 0),
('2012-06-08 14:30:01', 'host1', 0),
('2012-06-08 14:30:03', 'host2', 0),
('2012-06-08 14:31:01', 'host1', 0),
('2012-06-08 14:32:01', 'host1', 0),
('2012-06-08 14:32:02', 'host2', 1),
('2012-06-08 14:33:01', 'host1', 0);

これには、一部のホストの接続ステータスが含まれます。1は「オフライン」を意味し、0は「オンライン」を意味します。selectリクエストを使用して推測したいのは、各ホストの各「オフライン」ステータスの開始タイムスタンプと終了タイムスタンプです。上記の例では、リクエストは次のようなものを返す必要があります。

begin                  end                     host
'2012-06-08 14:20:01'  '2012-06-08 14:23:01'   'host1'
'2012-06-08 14:28:01'  '2012-06-08 14:29:01'   'host1'
'2012-06-08 14:32:02'  '2012-06-08 14:32:02'   'host2'

誰かが私にこれを修正する方法を教えてもらえますか?ありがとうございました。

4

1 に答える 1

2

基本的に、データ内の「ラン」または「ストリーク」を見つけようとしています。この回答は、タスクを実行する方法についてのガイダンスを提供する場合があります。

編集:リンクされた回答は、特定の問題について次のように翻訳できます。

SELECT
    host,
    MIN(ts) as StartDate, 
    MAX(ts) as EndDate
FROM (
    SELECT
        ts,
        host,
        result,
        (   SELECT
                COUNT(*) 
            FROM
                hoststatus h2 
            WHERE
                h1.host = h2.host
                and h1.result <> h2.result
                and h2.ts >= h1.ts) as rungroup
    FROM
        hoststatus h1) A
WHERE result = 1
GROUP BY host, rungroup
ORDER BY rungroup desc;
于 2012-06-08T19:18:10.927 に答える