2017-02-27 7 views
0
id timestamp  status 
167 6/28/2016 8:05:58 PM 0 
167 6/28/2016 8:06:02 PM 0 
167 6/28/2016 8:06:05 PM 0 
167 6/28/2016 8:08:06 PM 0 
167 6/28/2016 8:08:10 PM 0 
167 6/28/2016 8:08:13 PM 3 
167 6/28/2016 8:08:17 PM 3 
167 6/28/2016 8:10:41 PM 3 
167 6/28/2016 8:10:45 PM 3 
167 6/28/2016 8:10:48 PM 3 
167 6/28/2016 8:10:51 PM 0 
167 6/28/2016 8:10:55 PM 0 
167 6/28/2016 8:26:40 PM 0 
167 6/28/2016 8:26:44 PM 0 
167 6/28/2016 8:26:47 PM 3 
167 6/28/2016 8:26:50 PM 3 
167 6/28/2016 8:29:19 PM 3 
167 6/28/2016 8:29:23 PM 3 
167 6/28/2016 8:29:26 PM 0 
167 6/28/2016 8:29:29 PM 0 
167 6/28/2016 8:30:33 PM 0 
167 6/28/2016 8:30:37 PM 0 
167 6/28/2016 8:30:40 PM 3 
167 6/28/2016 8:30:44 PM 3 
167 6/28/2016 8:33:11 PM 3 
167 6/28/2016 8:33:15 PM 3 
167 6/28/2016 8:33:18 PM 0 
167 6/28/2016 8:33:21 PM 0 
167 6/28/2016 8:33:45 PM 0 
167 6/28/2016 8:33:48 PM 0 
167 6/28/2016 8:33:52 PM 0 
167 6/28/2016 8:33:55 PM 3 
167 6/28/2016 8:33:58 PM 3 
167 6/28/2016 8:34:59 PM 3 
167 6/28/2016 8:35:03 PM 3 

上記のデータは、当社のIoTシステムの一つからのものであり、それは基本的に機械がWRTにあるものの状態に告げる私は時間単位で生産部品を計算したいtimestampクエリのチューニングDashdb

0 being Stop and 3 being running.で1時間であり、このため論理はマシンの状態が3から0に変わったかどうかを確認してからaprtを生成することです。

私は以下の質問を書いており、意図した結果が得られています。 3〜5台のマシンで実行すると、クエリはうまく動作します.24時間以内に100台のマシンに対して同じものが実行されると、時間がかかります。今のところ、クエリは1時間のデータに対してデバイスごとに14分かかっています。

インフラ使用 - DashDB in bluemix、このデータベースへのデータはcloudantからbluemixサービスにプッシュされます。

==== 
select a.runstatus,a.runcount ,b.runstatus,b.runcount from (SELECT a.run_status runstatus, count(a.run_status) runcount 
FROM machinedata a where a.run_status <> (SELECT b.run_status 
     FROM machinedata b 
     WHERE a.machine_id = b.machine_id 
      AND a.timestamp > b.timestamp 
      ORDER BY b.timestamp DESC 
     LIMIT 1 
    ) and a.machine_id = 167 and a.run_status=0 AND a.`timestamp` BETWEEN '2016-06-28 20:00:01' 
            AND '2016-06-28 20:59:59' group by a.run_status) as a, 
     (SELECT a.run_status runstatus, count(a.run_status) runcount 
FROM machinedata a where a.run_status <> (SELECT b.run_status 
     FROM machinedata b 
     WHERE a.machine_id = b.machine_id 
      AND a.timestamp > b.timestamp 
      ORDER BY b.timestamp DESC 
     LIMIT 1 
    ) and a.machine_id = 167 and a.run_status=3 AND a.`timestamp` BETWEEN '2016-06-28 20:00:01' 
            AND '2016-06-28 20:59:59' group by a.run_status) as b 

答えて

0

この1つは仕事をする:

select timestamp part_produced_time, hour(timestamp) part_produced_hour 
     from (select *, first_value(status) over 
         (order by timestamp asc 
          rows between 1 preceding and current row) 
         as prev_status 
      from machinedata 
      ) 
     where status=0 and prev_status=3 
+0

HIトルステン、構文は –

+0

@LohithKumarエラー近い「によって順序」私は再びそれを検証し、私はそれを貼り付けたとして、それが正常に動作を与えています。 –

+0

ここに私のテストのために作成したテーブル '' 'CREATE TABLE MACHINEDATA(ID INT、TIMESTAMP TIMESTAMP、STATUS INT)' '' –

関連する問題