私は、サービスがオンラインである時間、サービスがオフラインになった時間、平均などのデータに関する簡単な統計を収集しようとしています。行の先頭に戻る行(ROW_NUMBER -1
)や2つの状態しか存在しないなど、特定のものに依存します。複数のステータスを持つタイムスタンプ間の平均を取得する
私のデータは、常に事実の後にログの形式で記録されます(つまり、ライブデータはありません)。わたしにとって最大の問題は、2つ以上の州があることです。現在、4つの異なる状態(Enabled、Disabled、Active、Inactive)の可能性があり、それぞれについてデータを収集できるようにしたいと考えています。
サービス名、古いステータス、新しいステータス、タイムスタンプを含むデータが一度に1行ずつ表示されます。現在、データは単一のテーブルに格納されています。私はデータの提供方法を変更することはできませんが、格納方法を変更することができ、私はそのテーブルが主な後戻りだと思っています。ここで
データは現在、私のテーブルに終わる可能性が方法の例です:
CREATE TABLE IF NOT EXISTS statusupdates (
sid int UNIQUE,
fullname VARCHAR(64),
oldstatus VARCHAR(16),
newstatus VARCHAR(16),
time TIMESTAMP);
INSERT INTO statusupdates VALUES
(null, 'fictHTTP', 'Off', 'On', '2017-01-01 02:20:00'),
(null, 'faked', 'On', 'Inactive', '2017-01-01 02:25:00'),
(null, 'ipsum', 'Inactive', 'On', '2017-01-01 02:30:00'),
(null, 'resultd', 'On', 'Inactive', '2017-01-01 02:35:00'),
(null, 'ipsum', 'On', 'Active', '2017-01-01 02:40:00'),
(null, 'fictHTTP', 'On', 'Active', '2017-01-01 02:45:00'),
(null, 'faked', 'Inactive', 'Off', '2017-01-01 02:50:00'),
(null, 'ipsum', 'Active', 'Off', '2017-01-01 02:55:00'),
(null, 'resultd', 'Inactive', 'Off', '2017-01-01 03:00:00');
私は私が見つけた一つの方法は、resultd
として、一つの項目にそれを絞ることであると考えています。 SELECT fullname, newstatus, time FROM statusupdates WHERE fullname='resultd' ORDER BY time DESC;
のようなものです。その後、そのデータを使って、同じ方法で別のクエリを実行します(降順であるため)一歩進み、そのレコードからnewstatus
を取得します。私がそれをタイプすると、それはちょっと混乱しているようです。
また、oldstatus
を取得し、2番目のクエリでは、次のレコードのnewstatus
を検索するために使用します。しかし、やはり、これはややこしいかもしれません。
私は、これらの2つの理論的な質問も組み合わせる方法があることを知っています。要約すると、私は私の頭をはるかに超えています、許してください!最後に、各ステータスの合計時間、平均時間などの統計を確認したいと思います。私の最大のハードルは、例えば、前のエントリからの時間を得ることができるような方法で、ipsum
のすべてのタイムスタンプエントリのような結果を提供するクエリを取得し、すべてのレコードを通過するまでこれを繰り返すことです。
おそらく、私はこれを完全に考えているのではなく、すべてのデータを1つのテーブルに押し込むことによって複雑すぎることでしょう。これは、これまで無関係なアイテムについては2回行っています。
追加の思考:単一のインスタンス、私はSELECT old_status, new_status, time FROM statusupdates WHERE time = '2017-01-01 03:00:00'
その後、私は1例えば私のデータを与える2つのタイムスタンプを引くSELECT old_status, new_status, time FROM statusupdates WHERE time < 'timeStamp' AND new_status = 'oldStatus'
次に、このようOLD_STATUS使用することができますを行うことができます。しかし、その後、次のステップのためにそれを行う方法、そして次はそのすべてがヒットするまで続けます。
更新、別の考え:いくつかの素晴らしい提案を組み合わせて、ログを逆戻りするのはどうですか? この時点で、読んでいた方向は関係ありません。ステータスが発生すると、不完全なレコードを作成します。それは、end_timeとしてold_statusとtime_stampを含むでしょう。その後、再びそのサービスに出会うと、new_status = old_statusかどうかをチェックし、start_timeとしてtime_stampでレコードを更新します。
これは多くのオーバーヘッドの地獄を引き起こすように思われる。すべてのレコードが存在するかどうかを確認する必要があります。それともそれほど悪くないのでしょうか? たとえばあなたがいずれかを持っていない場合は
select sum(endTime - startTime) from statusUpdate where oldStatus='active' group by fullName
を:
これはデータストリームのように聞こえる。ストリームを見ましたか? – efekctive
私がやった方が簡単だと思う。しかし、静的なテキストファイルは書き込まれた後ではありません。 – mrUlrik
ファイルデータを集計できますか? – efekctive