2016-06-30 2 views
1

나는 이것이 쿼리에서도 가능하지는 않겠지 만 여기까지 간다. 제 3 자 시스템에서 데이터를 정리하고 있습니다. 그들은 이름의 첫 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 

은 처음 두 개의 아이디 (JOH19700101)을 가질 필요가 -1 -2가 동일한 그룹 (0001)에 있기 때문에 첨부. 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; 

처음 두 샘플은 각각 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

하나의 작은 세부 조정으로 이익을 얻을 수도 있지만 고유 한 uid 값을 제공합니다. 현재 추가 된 숫자가 증가하기 때문에, 첫 번째 쌍의 중복은 -1과 -2가 uid에 추가 된 다음 다음 쌍인 -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

걱정할 필요가 없습니다! 희망 솔루션은 여전히 ​​유용합니다 –

관련 문제