这是帖子的延续 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答案 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 强>