【问题标题】:how to delete and update the rows when converetd mins data to hours in database将分钟数据转换为数据库中的小时时如何删除和更新行
【发布时间】:2017-10-12 06:59:40
【问题描述】:

这是帖子的继续 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 个月前的数据。

请帮帮我

提前致谢

萨加雷迪

【问题讨论】:

  • 如果你想插入和删除..不清楚所以你取消插入的数据..请更好地解释你需要
  • 这里我担心的是我每 10 分钟插入一次数据。每小时 4 条记录。每天 96。两个月 96 * 60。所以我想转换为平均小时数。所以转换成小时。现在获取的数据需要在同一个表中更新,mins数据需要删除。
  • @sagarreddy: 新插入的行在timestamp 列中是否有null 值。
  • 不,他们将拥有时间戳值。我正在使用 shell 脚本来执行此操作。如果可以使用 shell 也可以。我也在尝试从 shell

标签: mysql sql database datetime group-by


【解决方案1】:

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

【讨论】:

  • 如果此数据在表中插入 table1 值('localhost.localdomain',0.01,68148 ,383660,'2017-10-12 01:00:08');它不应该删除最近两个月的数据。谢谢 。我会检查它
  • 此行将被删除。只有新插入的行具有精确的timestamp 值的行不会被删除。您还可以通过引入where 子句(如select 语句)将删除限制在某个时间段
猜你喜欢
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 2012-01-23
相关资源
最近更新 更多