繁体   English   中英

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

[英]How to mark duplicates in an SQL query

我有一个SQL查询,其中查询出生日期,姓氏和名字的配音,以识别重复项。 以下查询找到约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的方法?

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

奥托姆

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

所有这些都假定您有一个副本 如果您不止一个,那么您将不得不尝试不同的方法。

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

这应该做的是您要执行的操作,一次完成UPDATE。

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:主键
  • 重复ID:指向被保留的dup
  • hasduplicate:布尔值,表示要保留的一个

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM