2016-07-20 10 views
0

自動スプリンクラーシステムの稼働時間を示すレポートを作成しようとしています。システムはいくつかのスプリンクラーで構成され、各スプリンクラーは自分自身だけを追跡し、その情報をデータベースに送信します。私の問題は、各スプリンクラーには独自の実行時間があります(5スプリンクラーがすべて同じ時間に10分間実行された場合、合計実行時間は50分で返されます)、実行の正味量のみを知りたい時間 - この例では、10分です。合計条件の検索方法

データベースは、タイムスタンプとブール値で構成され、スプリンクラーがシャットダウンまたはオフされるたびにそのタイムスタンプを記録します(オン/オフ状態はブール値の1/0で示されます)。

スプリンクラーが稼働していたかどうかに関係なく、システムが毎日稼働していた総ネット時間を把握するために、スプリンクラーが一切回らなかった時間枠すべてのスプリンクラーがオンになった)。私は、クエリの始まりが

SELECT * FROM MyTable 
WHERE MyBoolean = 0 
AND [ ... ] 

のようなものを見てと思うだろう。しかし、私は何をたどるとタイムスタンプをチェックするようになる条件文はよく分かりません。

この形式の情報を報告するデータベースに送信できるクエリはありますか?

EDIT:

はここでデータがに記録されているテーブルです - それは文字通りの名前、ブール値、およびブールが変更されたときの日時だし、それは、データベース全体 enter image description here

+1

適切なデータサンプルと期待される結果 – scaisEdge

+0

これは1テーブルのデータベースなので、スキーマの他のテーブルとは関係がありません。すべての噴霧器が同時に0に設定されている場合の復帰を得る(私はデータベースにはあまり良くないので、あなたの要求には何かが不足している可能性があります) –

+2

「区間パッキング」を検索してください。 –

答えて

0

すべてです時間スプリンクラーは1でスプリンクラー増分を実行しているの数をオンにし、あなたがこの得るので、あなたがデータを変換する場合は毎回1は1で数デクリメントをオフにします。あなたのように持って、その後

timestamp on/off 
07:00:05 1 
07:03:10 1 
07:05:45 -1 

を順序の事象の均等性;彼らが参照するスプリンクラーは無関係です。 (私は一瞬で明らかとなる理由のために-1にゼロを変更したあなたがしてこれを行うことができます「(2 *値) - 1」。)

は今一緒に、実行中の合計を置く:

select a.timestamp, (SELECT SUM(a.on_off) 
        FROM sprinkler_events b 
        WHERE b.timestamp <= a.timestamp) as run_total 
    from sprinkler_events a 
order by a.timestamp; 

ここで、sprinkler_eventsは上記の変換データです。これはあなたに与えるでしょう:

timestamp run_total 
07:00:05  1 
07:03:10  2 
07:05:45  1 

など。全部で0のランがあるすべての行は、すべてのスプリンクラーがオフになった時刻です。これはあなたが探しているものだと思います。彼らがオンまたはオフになっている時間を合計する必要がある場合は、追加の処理を行う必要があります:「連続する行間の日付の差」を検索すると、それに対する解決策が表示されます。

+0

くそー、私はこの答えが好きです。私の頭を包み込むのに1〜2分かかりましたが、私が自分の反対をぶつけたら、それは滑らかです。私は、彼らがどのスプリンクラーを参照するかは無関係であることを理解しようとしていました。同じスプリンクラーを連続して2回回転させることができないからです。ブール列をint/smallintに変更しますが、それにはまったく価値があります。いい答え。 –

0

すべてのスプリンクラーがオフになっているかどうかを調べることをおすすめします。たとえば:あなたはすべてのスプリンクラーの最新のステータスを取得することができるように

SELECT COUNT (DISTINCT s._NAME) AS sprinkers_currently_off 
FROM (
    SELECT 
     _NAME, 
     _VALUE, 
     _TIMESTAMP, 
     ROW_NUMBER() OVER (PARTITION BY _NAME ORDER BY _TIMESTAMP DESC, _VALUE) AS latest_rec 
    FROM sprinklers 
    ) s 
WHERE 
    _VALUE = 0 
    AND latest_rec = 1 

内側のクエリは、レコードを注文し、外側のクエリは現在オフになっているどのように多くのカウントします。 10個のスプリンクラーがある場合、このクエリーが10を返すときにすべてを報告します。

これを修正するには、過去を調べたい場合は内側のクエリに日付範囲を適用しますが、これは適切なトラックに表示されます。

関連する問題