2017-01-03 32 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語句中實現的第一件事。但我不知道如何實際更改數據庫。

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

對於第二步,我發現了幾個例子,但他們總是結合重複在一個單一的記錄,而不是在兩個(第一和最後一個),我打算這樣做。通常這些例子都適用於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

你的第二個要求是不清楚的。你能通過使用示例數據顯示你的意思嗎? –

+0

記錄數與加入操作無關。但我真的不認爲你需要一個。將要保留的記錄複製到另一個表並刪除原始數據可能會更容易。 – Shadow

+0

第二步是否清除了預期的結果? – Xcoder

回答

0

對於第一個查詢,如果您想在聚合後獲得完整記錄,則需要做比您建議的更多的工作。一種方法是做一個額外的加入:

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

不錯,但有什麼區別?我必須做MAX(CAST(VALUE AS DECIMAL)爲了在2016-03-27 10:34:05有正確的數據最大值,但是這並不改變文件日誌本身的數據不是嗎? – Xcoder

+0

經過進一步的研究,我意識到這個答案是錯誤的,它報告沒有重複的記錄,要求的是一個聲明,它永久地從數據庫中刪除重複報告,並用最大值替換它們。 – Xcoder