Mysql删除7天以上的记录,同时为每个device_id保留lasr 1条记录

时间:2019-07-08 06:17:14

标签: php sql datetime mariadb

我有一个表,其中包含device_id和日期时间,速度如下所示

 id | device_id |      server_time    | speed
 ---+-----------+---------------------+-------
 1  |     3     | 2019-06-24 13:35:37 |   25
 2  |     2     | 2019-06-22 13:35:37 |   35
 3  |     2     | 2019-06-27 15:15:22 |   23
 4  |     3     | 2019-06-24 13:35:37 |   54
 5  |     1     | 2019-06-20 13:35:37 |   55
 6  |     4     | 2019-06-10 13:35:37 |   34
 7  |     3     | 2019-06-24 13:35:37 |   4
 8  |     1     | 2019-06-21 13:35:37 |   25

我想删除7天以上的记录,但我需要为每个device_id保留至少7天以上的记录。

如何用mysql实现呢?

3 个答案:

答案 0 :(得分:1)

您可以运行查询以获取comment请求中获得的最高ID,并删除时间超过7天的所有行,而不是每个组的最高ID。

由于MySQL在更新/删除查询中不能在其自己的表上使用子查询,因此可以使用子子查询来获取由device_id分组的所有最高ID。

用实际的表名替换foo

DELETE FROM foo
WHERE server_time < DATE_SUB(NOW(), INTERVAL 7 DAY) 
  AND id NOT IN(SELECT * 
                FROM (SELECT MAX(id) 
                      FROM foo 
                      GROUP BY device_id
                ) AS t)

答案 1 :(得分:0)

使用row_number()

delete from 
(
  select *, row_number() over(partition by device_id order by server_time desc) as rn
  from tablename where server_Time>=NOW() - INTERVAL 7 DAY
)A where rn<>1

答案 2 :(得分:0)

我将其写为join

delete t
    from <table> t join
         (select device_id,
                 max(server_time) as max_server_time,
                 max(id) as max_id
          from <table> t2
          group by device_id
         ) t2
         on t.device_id = t2.device_id
    where t.id < t2.max_id and
          t.server_time < t2.max_server_time - interval 7 day;