在表中查找非重复行

时间:2013-03-11 06:51:54

标签: mysql

我有下表

|| some_id || value_A || value_B ||  timestamp ||
-------------------------------------------------
||       3 ||    1000 ||       1 || 1362979652 ||
||       3 ||    1001 ||       2 || 1362979652 ||
||       4 ||    1002 ||       2 || 1362979652 ||
||       4 ||    1003 ||       3 || 1362979652 ||
||       4 ||    1004 ||       3 || 1362979652 ||
||       3 ||    1000 ||       1 || 1362980605 ||
||       3 ||    1001 ||       1 || 1362980605 || <-- value_b is different here
||       4 ||    1002 ||       2 || 1362980605 ||
||       4 ||    1003 ||       3 || 1362980605 ||
||       4 ||    1004 ||       2 || 1362980605 || <-- value_b is different here

该表由一组数据组成,然后插入几乎相同的数据集(具有不同的时间戳)。数据并不完全相同,因为value_B在某些行中有所不同,如上所示。

我需要做的是删除所有重复的行,并用新的行替换旧的类似行(新行具有更新的时间戳)。

我已经尝试了几种不同的内连接方法,但我很难过。我认为这是两件事。首先,我需要简单地删除重复项:

|| some_id || value_A || value_B ||  timestamp ||
-------------------------------------------------
||       3 ||    1000 ||       1 || 1362979652 ||
||       3 ||    1001 ||       2 || 1362979652 ||
||       4 ||    1002 ||       2 || 1362979652 ||
||       4 ||    1003 ||       3 || 1362979652 ||
||       4 ||    1004 ||       3 || 1362979652 ||
||       3 ||    1000 ||       1 || 1362980605 || <-- will be deleted
||       3 ||    1001 ||       1 || 1362980605 ||
||       4 ||    1002 ||       2 || 1362980605 || <-- will be deleted
||       4 ||    1003 ||       3 || 1362980605 || <-- will be deleted
||       4 ||    1004 ||       2 || 1362980605 ||

接下来,如果剩下的新行具有相同的some_id和相同的value_A值,我需要删除任何OLDER行。

|| some_id || value_A || value_B ||  timestamp ||
-------------------------------------------------
||       3 ||    1000 ||       1 || 1362979652 ||
||       3 ||    1001 ||       2 || 1362979652 || <-- will be deleted
||       4 ||    1002 ||       2 || 1362979652 ||
||       4 ||    1003 ||       3 || 1362979652 ||
||       4 ||    1004 ||       3 || 1362979652 || <-- will be deleted
||       3 ||    1001 ||       1 || 1362980605 ||
||       4 ||    1004 ||       2 || 1362980605 ||

因此在处理之后,上面得到的表格如下所示:

|| some_id || value_A || value_B ||  timestamp ||
-------------------------------------------------
||       3 ||    1000 ||       1 || 1362979652 ||
||       4 ||    1002 ||       2 || 1362979652 ||
||       4 ||    1003 ||       3 || 1362979652 ||
||       3 ||    1001 ||       1 || 1362980605 ||
||       4 ||    1004 ||       2 || 1362980605 ||

我正在寻找一种有效的解决方案,因为实际上,我正在使用的表有几千行数据。效率是关键所在。

1 个答案:

答案 0 :(得分:2)

您的示例有点不对,因为1001是重复,而1002不是,但您在重复消除步骤中指示相反。这个简单的删除连接应该会得到正确的结果;

DELETE a 
FROM MyTable a
JOIN MyTable b
  ON a.value_A=b.value_A
 AND a.some_id = b.some_id
 AND (a.`timestamp` < b.`timestamp` AND a.value_B <> b.value_B OR
      a.`timestamp` > b.`timestamp` AND a.value_B =  b.value_B)

An SQLfiddle to test with

当然,永远不要在没有备份的情况下从Internet上的随机人员运行破坏性SQL。