2016-06-30 8 views
1

これはクエリでも可能だとは確信していませんが、ここには入ります。私は第三者から私たちのシステムに入ってきたデータを整理しています。最初の3文字からyyyymmdd形式のdobまでで構成されている、グループ内の各人に固有のあまりユニークでない文字列を作成しています。重複している数では、-1、-2、-3などをそ​​のIDに追加して、それらが本当にユニークであるようにしたいと思います。上記でMySQL重複したレコードを更新する

JOH19700101  0001 JOHN SMITH 1970-01-01 
JOH19700101  0001 JOHNSON SMITH 1970-01-01 
JOH19700101  0002 JOHN SMITH 1970-01-01 

それらが同じグループ(0001)であるので、最初の2つのID(JOH19700101)を有し-1および-2添付する必要があります。 3番目は、彼が別のグループ(0002)にいるのと同じままにすることができます。重複を選択

は十分に簡単だった:

SELECT x.id, x.uid, x.group, x.name, x.dob 
FROM import x 
INNER JOIN (
    SELECT uid 
    FROM import 
    GROUP BY group, uid 
    HAVING COUNT(uid) > 1) z ON x.uid = z.uid; 

は、最初の2個のサンプルがそれぞれJOH19700101-1とJOH19700101-2の新しいUIDを得るでしょうように、これにアップデートを追加する方法はありますか?

+0

何かのように:。http://stackoverflow.com/questions/14998877/row-number-by-several-columns変数を使用して、そしてそれは、行全体の値に基づいて更新です。 – xQbert

+0

append(-1、-2、-3)のようにローリングで更新を実行して重複を検出しますか?一意のIDごとに重複カウントを追跡するための手順が必要です。 – SArnab

+0

私はここでトリガーを考えています。ただ、ヒント – peter

答えて

1

これは、1つの細かい改良によって恩恵を受けることができますが、独自のuid値を提供します。今すぐ追加された数字は増分し続けるので、あなたの最初の対のdupesは、そのuidに-1と-2が追加され、次に-3と-4の次の対が追加されます。

@incを何とかリセットする必要がありますが、これはすべてのuid値が一意であり、異なるグループの同一のuidが変更されないことを保証します。

SET @inc :=0; 

UPDATE 
`import` i 
     JOIN (
    SELECT uid, `group` 
    FROM `import` 
     GROUP BY `group`, uid 
    HAVING COUNT(uid) > 1) d ON 
    i.uid = d.uid AND 
    i.group = d.group 

SET 
    i.uid = CONCAT(i.uid, '-',@inc:[email protected]+1) 
+0

ちなみに、私はあなたのインポートテーブル名とグループ列名をスマート引用符で置きます。その名前はMySQL関数と衝突します - そして、sqlyogのようないくつかのGUIでは、これは書式設定を混乱させ、不正な構文になります。 –

+0

申し訳ありません - 電子メールなしで休暇中でした。 – Steve

+0

心配はいりません!解決策がまだ役に立つと願っています –

関連する問題