我有一个表有大量关于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.
因此,尽管最后一个条目的目标值与第一个和第二个条目的值相同,但不应该删除该行,因为在第三行或第三行发生了更改或值。
答案 0 :(得分:1)
使用用户定义的变量来保存前一行的Source
和Destination
。当它们与当前行相同时,在子查询的结果中输出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列,则可以从子查询而不是source
,destination
和datetime
返回该列,并将其加入,而应该更多高效。