【问题标题】:Remove duplicate rows from table except for first timestamp of each day从表中删除重复的行,除了每天的第一个时间戳
【发布时间】:2017-06-20 13:23:09
【问题描述】:

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

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

每个uid、每个lid、每天(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。如果没有,我可以很容易地在带有循环的脚本中运行。

提前致谢

【问题讨论】:

    标签: mysql database sql-delete


    【解决方案1】:

    更新基于与 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 语句。这将返回每个盖子每个 uid 的所有最小日期时间戳。

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

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

    【讨论】:

    • @ScottN :是的,我做了一些小修改,因为我忘记在外部查询中使用DATE 转换。
    • 运行此错误:You can't specify target table 'checkins' for update in FROM clause。有什么想法吗?
    • DELETE 命令。似乎 SELECT 工作得很好,我已经验证它只选择最早的记录。
    猜你喜欢
    • 1970-01-01
    • 2018-08-16
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 2014-07-22
    • 2022-10-14
    相关资源
    最近更新 更多