0

我有下表

|| 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值,我需要删除任何旧行。

|| 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 ||

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

4

1 回答 1

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)

一个用于测试的 SQLfiddle

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

于 2013-03-11T07:15:02.603 回答