删除重复项,但不能在更改值后删除

时间:2017-02-18 01:44:30

标签: mysql sql

我有一个表有大量关于8百万的数据并在MySQL中运行的表。所以,我需要做的是删除所有重复项并仅保留日期列中的第一个条目或值,但之后有不同的条件。我将在下面提供一个示例数据:

列是源,目标和日期,我需要删除具有相同值的所有源和目标并保留最早的日期条目,但是例如目标更改,然后几分钟后目标值将返回到与我需要删除的值相同的值,不应删除这些值。

 Source Destination Datetime
    1        2         2017-01-01 23:45:46
    1        2         2017-01-01 23:46:46-this should be deleted
    1        3         2017-01-01 23:47:46
    1        2         2017-01-01 23:48:46-but not this one as the value for destination is changed from 3 to 2.

因此,尽管最后一个条目的目标值与第一个和第二个条目的值相同,但不应该删除该行,因为在第三行或第三行发生了更改或值。

1 个答案:

答案 0 :(得分:1)

使用用户定义的变量来保存前一行的SourceDestination。当它们与当前行相同时,在子查询的结果中输出Datetime。然后将其与原始表连接以获取要删除的行。

DELETE t1.*
FROM yourTable AS t1
JOIN (SELECT source, destination, IF(@prevSource = source AND @prevDest = destination, datetime, NULL) AS datetime, @prevSource := source, @prevDest := destination
      FROM yourTable
      ORDER BY datetime) AS t2
ON t1.source = t2.source AND t1.destination = t2.destination AND t1.datetime = t2.datetime
CROSS JOIN (select @prevSource := null, @prevDest := null) AS vars

如果您的表具有唯一的ID列,则可以从子查询而不是sourcedestinationdatetime返回该列,并将其加入,而应该更多高效。