削除する行を返すクエリを作成してみてください。(group_id,person_id,sequence)
の組み合わせが UNIQUE で、NULL 値がないと仮定すると...
SELECT t.*
FROM my_table t
JOIN ( SELECT o.group_id
, o.person_id
, MAX(o.sequence) AS max_sequence
FROM my_table o
GROUP BY o.group_id, o.person_id
HAVING COUNT(*) > 1
) d
ON d.group_id = t.group_id
AND d.person_id = t.person_id
AND d.max_sequence = t.sequence
キーワードをキーワードにDELETE
置き換えることで、それをステートメントに変換できます。SELECT
DELETE
または、これに似たステートメントで行を削除する場合、通常、削除する行の「バックアップ」としてテーブルを作成します。
SELECT の前にCREATE TABLE some_new_table_name AS
.
次に、DELETE クエリで「保存された」行を参照できます。
DELETE t.*
FROM my_table t
JOIN some_new_table_name d
ON d.group_id = t.group_id
AND d.person_id = t.person_id
AND d.max_sequence = t.sequence
このアプローチは、重複の「1」のみを取得します。元のクエリのカウント値が 2 より大きい場合、これを十分な回数繰り返す必要があります。そのたびに最大のシーケンス値を削除し、1 より大きいカウント値がなくなるまでそれを繰り返します。
削除する重複が多数ある場合は、わずかに異なるパターンを使用して、それらを一気に取得できます。
MAX(sequence)
(削除したい行) を返す代わりに、MIN(sequence)
保持したい行を返すことができます。そして、述語を変更します。
AND d.max_sequence = t.sequence
することが
AND d.min_sequence <> t.sequence
そのため、最小値を持つ行を除いて、そのすべての行を削除します。group_id, person_id
ステートメントSELECT
に変換する前に、これを最初に書くことを強くお勧めします。DELETE
また、テーブルの適切なバックアップを作成するか、削除する行のコピーを「保存」することをお勧めします。いくつかの行を復元する必要がある場合に備えて。