2017-06-23 10 views
0

背景: オペレータがWebページのボタンを押したときにコマンドが送信されるハードウェアデバイスが複数あります。なぜ時々コミュニケーションが遅いのかを調査しています。私は、3つの別々のコントローラでページを掻き出して毎分コントローラモードを変更するためのPython自動スクリプトを設定しました。私は操作の開始と期間を記録する。開始時間と所要時間を指定すると、分単位で開始されてからの表示時間が表示されます。

サンプルデータ:

Id Cont_id Start_time (pst) Duration (sec) 
316 11002 2017-06-22 20:05:13 5 
317 6224 2017-06-22 20:05:38 15 
319 7782 2017-06-22 20:06:20 15 
318 11002 2017-06-22 20:06:20 5 
320 6224 2017-06-22 20:06:56 15 
321 11002 2017-06-22 20:07:27 5 
336 7782 2017-06-22 20:07:38 500 
322 6224 2017-06-22 20:08:14 15 
323 11002 2017-06-22 20:08:36 5 
324 6224 2017-06-22 20:09:32 10 
325 11002 2017-06-22 20:09:43 10 
326 6224 2017-06-22 20:10:44 10 
327 11002 2017-06-22 20:10:55 10 
328 6224 2017-06-22 20:11:56 5 
329 11002 2017-06-22 20:12:07 15 
330 6224 2017-06-22 20:13:03 10 

望ましい結果: 私は、各コントローラが現在運営されているどのくらいの時間、毎分のエントリがあると教えてくれたレポートをしたいのですが。たとえば、サンプルデータ(コントローラ7782)の~20:07前後の時間を考えてみてください。私は以下を見たいと思います。

sample_time | cont_id | last_start_time | time_in_operation 
20:08:00* | 7782 | 20:07:38  | 22 
20:08:00 | 11002 | 20:07:27  | 5 * 
20:08:00 | 6224 | 20:06:56  | 15 
20:09:00 | 7782 | 20:07:38  | 88 
20:09:00 | 11002 | 20:08:36  | 5 
20:09:00 | 6224 | 20:08:14  | 15 
20:10:00 | 7882 | 20:07:38  | 148 
....etc 
  • 注1:私は、簡潔にするための時間を表示 - 私が実際にしたい全体の日付/時刻 注2:この操作が行われるため、5秒なので、 期間の値を使用します。

質問:私の最大の問題は、1分ごとにモックエントリが出現していることです。それが解決されたら、私は残りの部分を得ることができると思います...それで、最終的なレポートを次のように計算する方法で書かれた2つの時間範囲の間の1分ごとのエントリを与えるクエリを書くにはどうすればいいですか?サンプルデータごとに

セットアップ:

CREATE TABLE public.operationtimelog (
    id int4 NOT NULL DEFAULT nextval('operationtimelog_id_seq'::regclass), 
    controller_id int4 NOT NULL, 
    op_start_time timestamp NOT NULL, 
    op_duration int4 NOT NULL, 
    CONSTRAINT operationtimelog_pkey PRIMARY KEY (id) 
) 
WITH (
    OIDS=FALSE 
); 

insert into 
    operationtimelog (controller_id, op_start_time, op_duration) values 
    (11002, '2017-06-22 20:05:13', 5), 
    (6224, '2017-06-22 20:05:38', 15), 
    (7782, '2017-06-22 20:06:20', 15), 
    (11002, '2017-06-22 20:06:20', 5), 
    (6224, '2017-06-22 20:06:56', 15), 
    (11002, '2017-06-22 20:07:27', 5), 
    (7782, '2017-06-22 20:07:38', 500), 
    (6224, '2017-06-22 20:08:14', 15), 
    (11002, '2017-06-22 20:08:36', 5), 
    (6224, '2017-06-22 20:09:32', 10), 
    (11002, '2017-06-22 20:09:43', 10), 
    (6224, '2017-06-22 20:10:44', 10), 
    (11002, '2017-06-22 20:10:55', 10), 
    (6224, '2017-06-22 20:11:56', 5), 
    (11002, '2017-06-22 20:12:07', 15) 
+0

あなたがエントリID 336 –

+0

@OtoShavadzeのためにその目的の結果を取得する必要がありますなぜ私は、ロジックを得ることはありません:あなたはそれ他人を理解していなかった場合は...ありがとうもう駄目です。希望の結果を更新しました。十分な明快さがあれば教えてください。 – SteveJ

+0

@SteveJ解決策を使って質問を更新したので、末尾に 'select * from durations'を含めてください:-) –

答えて

1

あなたの質問に答える:与えられた2つのタイムスタンプは、それらの間の毎分のレコードを保持するテーブルを生成します。

select time_column 
from generate_series(
    '2017-06-22 20:00:00'::TIMESTAMP, 
    '2017-06-22 20:09:00'::TIMESTAMP, 
    '1m' 
) x(time_column) 

出力:

 time_column 
--------------------- 
2017-06-22 20:00:00 
2017-06-22 20:01:00 
2017-06-22 20:02:00 
2017-06-22 20:03:00 
2017-06-22 20:04:00 
2017-06-22 20:05:00 
2017-06-22 20:06:00 
2017-06-22 20:07:00 
2017-06-22 20:08:00 
2017-06-22 20:09:00 

次に、あなたのサンプルデータからop_start_timeの秒の切り捨てとその時間列によってそれにあなたのテーブル/クエリを接続するためにLEFT JOINを使用することができます。

タイムスタンプから秒数を切り捨てるにはどうすればよいですか?

select date_trunc('m','2017-06-22 20:07:38'::timestamp) 

出力:

 date_trunc 
--------------------- 
2017-06-22 20:07:00 
+0

これは私が探していた作品です - ありがとう。私はそれを取って実行し、私が困惑した場合には返信します。それがうまくいくならば、私は質問を編集して余分なものを取り除き、これを答えにするべきだと思う。 – SteveJ

+0

確かに、質問文が見つかって追加の文脈が私のためにあいまいになったので、私はあなたのステートメントロジックを掘り下げませんでした。 –

関連する問題