2017-10-12 41 views
0

converetd分鐘數據以小時時刪除和更新中的行,這是後的延續 need database hourly data before two months如何在數據庫

hostname    | cpuload | freedisk | freemem |timestamp 
localhost.localdomain | 0.15 | 136052 | 383660 | 2017-08-01 00:10:08 
localhost.localdomain | 0.03 | 136492 | 383660 | 2017-08-01 00:20:08 
localhost.localdomain | 0.01 | 133456 | 383660 | 2017-08-01 00:30:08 
localhost.localdomain | 0.10 | 64544  | 383660 | 2017-08-01 00:40:08 
localhost.localdomain | 0.01 | 68148  | 383660 | 2017-08-01 01:00:08 

獲得的輸出是

hostname    cpuload  freedisk  freemem 
------------------------------------------------------------- 
localhost.localdomain 0.072500 117636.0000 383660.0000 
localhost.localdomain 0.010000 68148.0000 383660.0000 

我使用的查詢

SELECT t1.hostname 
    ,avg(cpuload) AS cpuload 
    ,avg(freedisk) AS freedisk 
    ,avg(freemem) AS freemem 
FROM table1 t1 
WHERE t1.TIMESTAMP < current_timestamp - interval '42' day 
GROUP BY date_format(t1.TIMESTAMP, '%Y%m%d%H'); 

這裏我想插入獲得的結果到同一個表和del ete 2個月前我們做過手術的數據。

請幫我

在此先感謝

薩加爾雷迪

+0

如果你想插入和刪除..不明確,所以你插入取消數據..更好地解釋你需要請 – scaisEdge

+0

這裏我關心的是我每10分鐘插入一次數據。每小時4條記錄。每天96.兩個飛蛾96 * 60。所以我想轉換成平均小時數。所以轉換成小時。現在獲得的數據需要在同一個表中更新,分鐘數據需要刪除。 –

+0

@sagarreddy:新插入的行在'timestamp'列中有'null'值。 – zarruq

回答

0

你可以插入新生成如下使用insert-select數據。

insert into table1 
SELECT t1.hostname 
    ,avg(cpuload) AS cpuload 
    ,avg(freedisk) AS freedisk 
    ,avg(freemem) AS freemem, 
    date_format(t1.TIMESTAMP, '%Y-%m-%d %H')as timestamp 
FROM table1 t1 
WHERE t1.TIMESTAMP < current_timestamp - interval '42' day 
GROUP BY date_format(t1.TIMESTAMP, '%Y%m%d%H'); 

插入後,表格如下所示。

hostname    cpuload freedisk freemem timestamp 
--------------------------------------------------------------------------- 
localhost.localdomain 0.15  136052  383660 01.08.2017 00:10:08 
localhost.localdomain 0.03  136492  383660 01.08.2017 00:20:08 
localhost.localdomain 0.01  133456  383660 01.08.2017 00:30:08 
localhost.localdomain 0.10  64544  383660 01.08.2017 00:40:08 
localhost.localdomain 0.01  68148  383660 01.08.2017 01:00:08 
localhost.localdomain 0.07  117636  383660 01.08.2017 00:00:00 
localhost.localdomain 0.01  68148  383660 01.08.2017 01:00:00 

DEMO

您可以使用下面的查詢然後刪除舊數據。

DELETE 
FROM table1 
WHERE TIMESTAMP NOT IN (
     SELECT TIMESTAMP 
     FROM (
      SELECT date_format(t1.TIMESTAMP, '%Y-%m-%d %H:00:00') AS TIMESTAMP 
      FROM table1 t1 
      WHERE t1.TIMESTAMP < current_timestamp - interval '42' day 
      GROUP BY date_format(t1.TIMESTAMP, '%Y%m%d%H') 
      ) x 
     ); 

請注意,作爲你的表沒有插入timestamp列或任何其他使用該行可辨,上面的查詢是在你的表不包含的確切時間戳的假設寫新生成的行。


更新1:

如果你想刪除一個特定時間段的數據,你可以在條款如下,其中提到它。

DELETE 
FROM table1 
WHERE TIMESTAMP NOT IN (
     SELECT TIMESTAMP 
     FROM (
      SELECT date_format(t1.TIMESTAMP, '%Y-%m-%d %H:00:00') AS TIMESTAMP 
      FROM table1 t1 
      WHERE t1.TIMESTAMP < current_timestamp - interval '42' day 
      GROUP BY date_format(t1.TIMESTAMP, '%Y%m%d%H') 
      ) x 
     ) 
    AND TIMESTAMP BETWEEN '2017-08-01 00:00:00' 
     AND '2017-09-30 11:00:00'; 

希望這會給你一個想法:-)

DEMO

+0

如果這個數據是在表插入到table1值('localhost.localdomain',0.01,68148,383660,'2017-10-12 01:00:08');它不應該刪除最近兩個月的數據。謝謝 。我會檢查它 –

+0

這一行將被刪除。只有具有新插入行的確切'timestamp'值的行纔會被刪除。您還可以通過引入'select'語句之類的'where'子句來限制刪除某個時間段 – zarruq

+0

@sagarreddy:檢查答案中的更新。 – zarruq