2017-01-03 5 views
1

測定データとステータスデータを持つ大規模なデータベースでは、大量の情報を失うことなくデータを削減するつもりです。私はいくつかの例を研究しましたが、私のSQLスキルは成功するには限界があるようです...MySQL:重複と定数の削除/集計によるデータのクリーンアップ

テーブルには数百万のデータがあります。テーブルの定義は

TIMESTAMP TIMESTAMP, DEVICE varchar(32), TYPE varchar(32), EVENT varchar(512), READING varchar(32), VALUE varchar(32), UNIT varchar(32) 

です。 )(最大を使用して読んで同じタイムスタンプ、デバイスとの

  • 集計値、:

    +---------------------+----------+------+---------+---------+-------+------+ 
    | TIMESTAMP   | DEVICE | TYPE | EVENT | READING | VALUE | UNIT | 
    +---------------------+----------+------+---------+---------+-------+------+ 
    | 2016-03-27 10:17:45 | KNX_428c | KNX | 49 mA | state | 49 | mA | 
    | 2016-03-27 10:19:45 | KNX_428c | KNX | 47 mA | state | 47 | mA | 
    | 2016-03-27 10:21:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:23:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:23:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:25:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:25:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:27:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:27:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:29:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:31:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:31:44 | KNX_428c | KNX | 47 mA | state | 47 | mA | 
    | 2016-03-27 10:33:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:33:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:34:04 | KNX_428c | KNX | 136 mA | state | 136 | mA | 
    | 2016-03-27 10:34:04 | KNX_428c | KNX | 165 mA | state | 165 | mA | 
    | 2016-03-27 10:34:05 | KNX_428c | KNX | 136 mA | state | 136 | mA | 
    | 2016-03-27 10:34:05 | KNX_428c | KNX | 107 mA | state | 107 | mA | 
    | 2016-03-27 10:34:05 | KNX_428c | KNX | 79 mA | state | 79 | mA | 
    | 2016-03-27 10:34:06 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
    | 2016-03-27 10:34:29 | KNX_428c | KNX | 107 mA | state | 107 | mA | 
    | 2016-03-27 10:34:29 | KNX_428c | KNX | 136 mA | state | 136 | mA | 
    | 2016-03-27 10:34:30 | KNX_428c | KNX | 165 mA | state | 165 | mA | 
    | 2016-03-27 10:34:30 | KNX_428c | KNX | 139 mA | state | 139 | mA | 
    | 2016-03-27 10:34:30 | KNX_428c | KNX | 107 mA | state | 107 | mA | 
    | 2016-03-27 10:34:31 | KNX_428c | KNX | 51 mA | state | 51 | mA | 
    | 2016-03-27 10:34:44 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:35:44 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:37:44 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:37:44 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:39:43 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:41:43 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:43:43 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:45:43 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:47:43 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:47:43 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    | 2016-03-27 10:49:43 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
    

    が、私は二つのことをするつもり:フルテーブルには、それぞれが個別に処理しなければならない多くの異なるデバイスと測定値を持っています

  • 定数値の最初と最後を除いて、連続する同一の値を削除します。

グループで選択した文で最初に達成したことは、しかし、私は実際にデータベースをどのように変更するのか分かりません。第二段階のために

SELECT *,MAX(VALUE) FROM filelog 
GROUP BY TIMESTAMP,DEVICE,READING 

私はいくつかの例を見つけましたが、私はそれをするつもりのように、彼らは常に1つのレコードではなく2つ(最初と最後)で重複を兼ね備えています。そして、通常、これらの例はJOINを使って動作しますが、これは数百万のデータセットでは不可能だと思います。

結果は以下のようにしなければならない:あなたのサポートのための

| 2016-03-27 10:17:45 | KNX_428c | KNX | 49 mA | state | 49 | mA | 
| 2016-03-27 10:19:45 | KNX_428c | KNX | 47 mA | state | 47 | mA | 
| 2016-03-27 10:21:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
| 2016-03-27 10:33:44 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
| 2016-03-27 10:34:04 | KNX_428c | KNX | 136 mA | state | 165 | mA | 
| 2016-03-27 10:34:05 | KNX_428c | KNX | 136 mA | state | 136 | mA | 
| 2016-03-27 10:34:06 | KNX_428c | KNX | 50 mA | state | 50 | mA | 
| 2016-03-27 10:34:29 | KNX_428c | KNX | 107 mA | state | 136 | mA | 
| 2016-03-27 10:34:30 | KNX_428c | KNX | 165 mA | state | 165 | mA | 
| 2016-03-27 10:34:31 | KNX_428c | KNX | 51 mA | state | 51 | mA | 
| 2016-03-27 10:34:44 | KNX_428c | KNX | 0 mA | state | 0  | mA | 
| 2016-03-27 10:49:43 | KNX_428c | KNX | 0 mA | state | 0  | mA | 

感謝。

+0

2番目の要件は私には分かりません。サンプルデータを使って何を意味するのかを示すことができますか? –

+0

レコードの数は、結合操作には関係ありません。しかし、私はあなたがとにかくそれを必要とするとは思わない。保存したいレコードを別のテーブルにコピーして元のデータを削除する方が簡単かもしれません。 – Shadow

+0

2番目のステップは今や期待された結果ではっきりしていますか? – Xcoder

答えて

0

最初のクエリでは、集計後に完全なレコードを取得する場合は、提案したものよりも多くの作業を行う必要があります。 1つの方法は、追加の参加を行うことです。

SELECT t1.* 
FROM filelog t1 
INNER JOIN 
(
    SELECT TIMESTAMP, DEVICE, READING, MAX(VALUE) AS VALUE 
    FROM filelog 
    GROUP BY TIMESTAMP, DEVICE, READING 
) t2 
    ON t1.TIMESTAMP = t2.TIMESTAMP AND 
     t1.DEVICE = t2.DEVICE AND 
     t1.READING = t2.READING AND 
     t1.VALUE  = t2.VALUE 
+0

いいですが、違いは何ですか?私は2016-03-27 10:34:05でデータの正しい最大値を得るためにMAX(CAST(VALUE AS DECIMAL))を行う必要がありますが、これはファイルログ自体のデータを変更しません。 – Xcoder

+0

さらに研究を重ねた結果、この答えは間違っていることに気がつきました。重複しないでレコードを報告します。質問はデータベースから重複レポートを恒久的に削除し、最大値で新しいレコードに置き換えます。 – Xcoder