除了每天的第一个时间戳之外,从表中删除重复的行

时间:2017-06-20 13:23:09

标签: mysql database sql-delete

我需要帮助从表中删除不需要的行。

该表具有用户"签到"由于软件中的早期错误,有些日子有重复。

每天uidlid只应该有一个条目(timestamp)。

示例数据:

 id | t |uid| lid| timestamp
______________________________________
339 | 0 | 1 | 54 | 2014-03-28 16:02:05  <-- KEEP
341 | 0 | 1 | 54 | 2014-03-28 17:14:27  <-- DISCARD
420 | 0 | 1 | 54 | 2014-04-02 14:47:55  <-- KEEP
421 | 0 | 1 | 54 | 2014-04-02 15:15:04  <-- DISCARD
423 | 0 | 1 | 54 | 2014-04-03 11:06:36  <-- KEEP
427 | 0 | 1 | 54 | 2014-04-03 12:15:47  <-- DISCARD
428 | 0 | 1 | 54 | 2014-04-03 14:24:20  <-- DISCARD
470 | 0 | 1 | 54 | 2014-04-04 12:43:36  <-- KEEP
487 | 0 | 1 | 54 | 2014-04-04 14:34:38  <-- DISCARD
488 | 0 | 1 | 54 | 2014-04-04 14:36:41  <-- DISCARD

非常感谢我可以在我的桌面上执行的MySQL DELETE命令,以丢弃不需要的行(id)。

此外,如果可能,这应该适用于多个uidlid。如果没有,我可以很容易地在带有循环的脚本中运行。

提前致谢

1 个答案:

答案 0 :(得分:2)

更新基于与OP的聊天:

试试这个:

DELETE a
FROM 
check-ins a
left join 
(  
  SELECT uid, lid, MIN(timestamp) AS min_time 
  FROM check-ins 
  GROUP BY uid, lid, DATE(timestamp)
 ) AS P
on 
(a.uid = p.uid AND
 a.lid = p.lid AND
 a.timestamp = p.min_time)  
where p.uid IS NULL 

解释: 首先尝试select语句。这将返回每个盖子每个盖子的所有最小日期时间戳。

SELECT uid, lid, MIN(timestamp) AS min_time 
FROM check-ins 
GROUP BY uid, lid, DATE(timestamp)

然后删除除这些记录之外的所有内容。