我甚至不确定在查询中这是可行的,但是这里有。我正在清理第三方进入我们系统的数据。他们为一个组中的每个人创建一个不那么独特的唯一字符串,该字符串包含名字的前3个字母,然后是yyyymmdd格式的dob。在少数重复的内容中,我想在该ID上附加-1,-2,-3等,这样它们才真正是唯一的。
JOH19700101 0001 JOHN SMITH 1970-01-01
JOH19700101 0001 JOHNSON SMITH 1970-01-01
JOH19700101 0002 JOHN SMITH 1970-01-01
在上面,前两个ID(JOH19700101)需要附加-1和-2,因为它们在同一组(0001)中。第三个可以保持与他在不同组中的相同(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 :(得分: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:=@inc+1)