如何在SQL查询中标记重复项

时间:2011-01-23 21:33:42

标签: sql mysql

我有一个SQL查询,它查看出生日期,姓氏和名字的soundex以识别重复项。以下查询找到大约8,000行(我假设这意味着大约有8,000个重复记录)。

select dob,last_name,soundex(first_name),count(*)
from clients
group by dob,last_name,soundex(first_name)
having count(*) >1

几乎所有结果的计数都是2,有几个计数为3,显然记录在合并的两个数据库之一中存在两次。

我需要采取的下一步是使用重复标记标记其中一行,并不重要,并用相反的行键标记每一行。有没有办法使用SQL?

3 个答案:

答案 0 :(得分:2)

这是一个查询,它不仅会为您提供重复项,还会为您提供插入的第一个ID(假设Id是顺序主键列)和最新的ID。

OTTOMH

select dob, last_name, soundex(first_name) firstnamesoundex, min (Id) OldestId, max (Id) NewestId, Count (*) NumRows
from clients
group by dob,last_name,soundex(first_name)
having count(*) >1

您可以在JOIN中使用它来进行更新

UPDATE Clients
SET OppositeRowId = DuplicateRows.NewestId
FROM
(
    select dob, last_name, soundex(first_name) firstnamesoundex, min (Id) OldestId, max (Id) NewestId, Count (*) NumRows
    from clients
    group by dob,last_name,soundex(first_name)
    having count(*) >1
) DuplicateRows
WHERE
DuplicateRows.OldestId = Clients.Id

所有这些都假定您有一个重复。如果你有多个,你将不得不尝试不同的东西。

答案 1 :(得分:2)

好吧,您可以使用SELECT DISTINCT,然后将单行标记为“不重复” - 然后搜索“不重复”的行以查找副本。

答案 2 :(得分:2)

这应该是你所追求的,一次性更新。

UPDATE FROM clients c
INNER JOIN
(
  select dob,last_name,soundex(first_name),MIN(id) as keep
  from clients
  group by dob,last_name,soundex(first_name)
  having count(*) >1
) k
ON c.dob=k.dob AND c.last_name=k.last_name AND soundex(c.first_name)=soundex(k.first_name)
SET duplicateid = NULLIF(k.keep, c.id),
    hasduplicate = (k.keep = c.id)

假设您有3个未在问题中列出的列

  • id:主键
  • duplicateid:指向要保留的dup
  • hasduplicate:boolean,标记要保留的那个