0

いくつかのアナログ レジスタ (0 と 1) の値をデータベースに保存します。次のことを行いたいと思います。

センサー値を格納するために、データベースに次のテーブルがあります。

ID   |          TIMESTAMP     |  ALIAS  |  STATUS
 1   |    2012-09-12 12:31:01 |   AR1   |     0
 2   |    2012-09-12 12:31:02 |   AR1   |     0
 3   |    2012-09-12 12:31:03 |   AR1   |     0
 4   |    2012-09-12 12:31:04 |   AR1   |     0
 5   |    2012-09-12 12:31:05 |   AR1   |     0
 6   |    2012-09-12 12:31:06 |   AR1   |     0
 7   |    2012-09-12 12:31:07 |   AR1   |     1
 8   |    2012-09-12 12:31:08 |   AR1   |     1
 9   |    2012-09-12 12:31:09 |   AR1   |     1
10   |    2012-09-12 12:31:10 |   AR1   |     0
11   |    2012-09-12 12:31:11 |   AR1   |     0
12   |    2012-09-12 12:31:12 |   AR1   |     0
13   |    2012-09-12 12:31:13 |   AR1   |     0
14   |    2012-09-12 12:31:14 |   AR1   |     0
15   |    2012-09-12 12:31:15 |   AR1   |     1
16   |    2012-09-12 12:31:16 |   AR1   |     0
17   |    2012-09-12 12:31:17 |   AR1   |     0
18   |    2012-09-12 12:31:01 |   AR1   |     0
 ...

SQLクエリを使用して、不要なポイントを使用せずにグラフを作成するために、レジスターがステータスを変更したときに戻ることができるようにしたいと考えています。テーブルは 100 万以上の値で構成されていることに注意してください。これにより、返されるデータのサイズが小さくなり、グラフが高速になります。

GROUP BYMySQL が説明どおりの機能を提供するかどうかはわかりませんが、最初はそれが良い解決策かもしれないと思っていましたが、残念ながらそうではありません。

助言がありますか?

望ましい出力:

ID   |          TIMESTAMP     |  ALIAS  |  STATUS
 1   |    2012-09-12 12:31:01 |   AR1   |     0
 6   |    2012-09-12 12:31:06 |   AR1   |     0
 7   |    2012-09-12 12:31:07 |   AR1   |     1
 9   |    2012-09-12 12:31:09 |   AR1   |     1
10   |    2012-09-12 12:31:10 |   AR1   |     0
14   |    2012-09-12 12:31:14 |   AR1   |     0
15   |    2012-09-12 12:31:15 |   AR1   |     1
16   |    2012-09-12 12:31:16 |   AR1   |     0
 ...

値の最初と最後の出現と新しい値のみが必要なため、連続する値の間の中間行を削除していることがわかります。

助言がありますか?

4

1 に答える 1

1

私は変数でそれを行います。残念ながら、それを書き出すことはできませんが、ここで私の同様の応答を参照してください。

mysql で連続レコードを取得する

明日もう一度確認してみます。

今日の答え:

(前の行を含めるのではなく) ステータスが変化する行だけを使用できますか? これにより、すべてのデータサンプルが記録されたと仮定して、期間が得られます...

もしそうなら、これはうまくいきます:

set @last_status = null;
select  id, timestamp, alias, status,
  case when @last_status is null or status != @last_status then 1 else  0 end as changed, 
@last_status := status
from sensor_values
having changed = 1;

そうでない場合は、朝のインタビューの後にもう少しハックします:)

于 2012-09-13T23:31:04.983 に答える