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

もちろん、バックアップなしでインターネット上のランダムな人から破壊的な SQL を実行しないでください。

于 2013-03-11T07:15:02.603 に答える