mysql - 将数据库中的分钟数据转换为小时时如何删除和更新行

标签 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个月前的数据。

请帮助我

提前致谢

萨加雷迪

最佳答案

您可以使用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

关于mysql - 将数据库中的分钟数据转换为小时时如何删除和更新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46703329/

相关文章:

MySQL - 计算自表中重置事件以来的累积

SQL count 连接不同的多列

sql在连接内连接?

sql - 我应该将此过滤放在 SQL 还是我的应用程序代码中?

php - Python 和 PHP 使用相同的 mySQL 数据库

MySQL 通过 SSH 从 Linux 复制到 Windows 上的 MySQL?

c# - SQL 查询插入并获取一定长度范围内的价格

php - 大字符串 : Text files or SQL DB?

mysql - 获取 feed 时的格式问题

mysql - 搜索字符串 Spring Data MySQL 的列表