我有一个表,其中包含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实现呢?
答案 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;