我有下表
|| 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 ||
我正在寻找一种有效的解决方案,因为实际上,我正在使用的表有几千行数据。效率是关键所在。
答案 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)
当然,永远不要在没有备份的情况下从Internet上的随机人员运行破坏性SQL。