当converetd在数据库中将数据分成小时时,如何删除和更新行

时间:2017-10-12 06:59:41

标签: mysql sql database datetime group-by

这是帖子的延续 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');

这里我想将获得的结果插入到同一个表中,并删除我们进行操作的2个月前的数据。

请帮帮我

提前致谢

sagar reddy

1 个答案:

答案 0 :(得分: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:

如果要删除特定时间段的数据,可以在where子句中提及,如下所示。

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