删除比每个ID最新记录早2天的记录

时间:2017-08-17 10:40:52

标签: mysql

我有一张200左右不同身份证的桌子。每个ID在不同时间戳记记录的数据大约为100倍。我想为每个ID分别删除比该特定ID最年轻记录早2天的记录。 阿卡,我想为每个ID提供至少2天的清单。有些可能是CURRENTDATE,其他列表可能是2天,从上个月开始。

这会有用吗?:

> DELETE FROM loggingTable WHERE (DATE_SUB( MAX(T_log),INTERVAL 48 HOUR)> T_log) GROUP BY ID

我不想删除我的数据......

1 个答案:

答案 0 :(得分:0)

如果您不想意外删除数据,请通过以下方式解决此问题(从最差到最佳):

  1. 创建数据副本并进行处理。
  2. 在交易中进行操作。这可以像

    一样工作
    START TRANSACTION;
    DELETE ...;
    SELECT ...; /* check if everything worked as expected*/
    /*if yes...*/
    COMMIT; /* this writes your changes on disk */
    /*if not, don't do a commit, but instead...*/
    ROLLBACK; /* this undoes all the statements in the transaction */
    
  3. 首先将DELETE语句写为SELECT语句。然后检查要删除的内容。如果可以,请将其转换为DELETE语句(如果您愿意,可将此方法与上面的第2点结合使用)。例如,如下所示:

    SELECT 
    *
    FROM loggingTable lt
    JOIN (SELECT ID, MAX(T_log)AS max_log FROM loggingTable GROUP BY ID) AS m ON lt.ID = m.ID
    WHERE lt.T_log < m.max_log - INTERVAL 2 DAY;
    

    如果看起来没问题:

    DELETE lt.*
    FROM loggingTable lt
    JOIN (SELECT ID, MAX(T_log)AS max_log FROM loggingTable GROUP BY ID) AS m ON lt.ID = m.ID
    WHERE lt.T_log < m.max_log - INTERVAL 2 DAY;
    
  4. 当然,您也可以将方法2和3与1结合使用; - )

    一些额外的解释:我加入查询表的原因是,您不能在MAX()子句中使用聚合函数(如WHERE)。 sql语句的计算方式如下:

    1. FROM
    2. WHERE
    3. GROUP BY
    4. HAVING
    5. ORDER BY
    6. 选择
    7. 因为在where子句之前评估group by子句,所以无法访问那里的聚合函数。它们随group by子句一起引入。