SQL - 查找重复字段并计算匹配的字段数

时间:2014-09-25 19:54:58

标签: sql sql-server count duplicates

我有一个庞大的客户数据库,在某些情况下,客户已多次添加,导致问题。我能够使用查询来识别完全匹配的记录,尽管有些记录有轻微的变化,例如不同的地址或给定的名称。

我想查询10个字段,有些记录将匹配所有10个显然是重复的记录,尽管其他字段可能只匹配5个字段与另一个记录并需要进一步调查。因此,我想创建一个结果集,其中包含一个计数已匹配的字段数的字段。基本上,为了创建可能的罩的评级,结果是实际匹配。所有10个都是明确的副本,但5个只是可能的副本。

有些只会匹配POSTCODE和FIRSTNAME,通常可以打折。

这样的东西会有所帮助,因为它只返回在所有3条记录上明确匹配的记录,由于数据量庞大,它们并不真正有用。

SELECT field1,field2,field3, count(*)
FROM table_name
GROUP BY field1,field2,field3
HAVING count(*) > 1

3 个答案:

答案 0 :(得分:0)

您可以尝试类似

的内容
Select field1, field2, field3, ... , field10, count(1)
  from customerdatabase
 group by field1, field2, field3, ... , field10
 order by field1, field2, field3, ... , field10

field1field10按“最可识别/最重要”的顺序排列。

答案 1 :(得分:0)

这很接近我已经达到了我想要实现的目标,这将返回所有具有任何重复字段的记录。我想在结果中添加一列,指示有多少字段与表中的任何其他记录匹配。总共有大约40,000条记录。

select * from [CUST].[dbo].[REPORTA] as a
where exists
(select [GIVEN.NAMES],[FAMILY.NAME],[DATE.OF.BIRTH],[POST.CODE],[STREET],[TOWN.COUNTRY]
   from [CUST].[dbo].[REPORTA] as b
   where a.[GIVEN.NAMES] = b.[GIVEN.NAMES]
     or a.[FAMILY.NAME] = b.[FAMILY.NAME]
      or a.[DATE.OF.BIRTH] = b.[DATE.OF.BIRTH]
      or a.[POST.CODE] = b.[POST.CODE]
      or a.[STREET] = b.[STREET]
       or a.[TOWN.COUNTRY] = b.[TOWN.COUNTRY]
   group by [GIVEN.NAMES],[FAMILY.NAME],[DATE.OF.BIRTH],[POST.CODE],[STREET],[TOWN.COUNTRY]
   having count(*) >= 1) 

此查询将返回数千条记录,但我通常对具有大量精确匹配字段的记录感兴趣

答案 2 :(得分:0)

您只是错过了CUBE()的魔力,它会自动生成所有列的组合

DECLARE @duplicate_column_threshold int = 5;

WITH cte AS (
  SELECT
    field1,field2,...,field10
   ,duplicate_column_count = (SELECT COUNT(col) FROM (VALUES (field1),(field2),...,(field10)) c(col))
  FROM table_name
  GROUP BY CUBE(field1,field2,...,field10)
  HAVING COUNT(*) > 1
)
SELECT *
INTO #duplicated_rows
FROM cte
WHERE duplicate_column_count >= @duplicate_column_threshold

更新:要从原始表中获取行,请使用在比较列时将NULL视为通配符的技术将其与#duplicated_rows连接。

SELECT
  a.* 
 ,b.duplicate_column_count
FROM table_name a 
INNER JOIN #duplicated_rows b
  ON  NULLIF(b.field1,a.field1) IS NULL
  AND NULLIF(b.field2,a.field2) IS NULL
  ...
  AND NULLIF(b.field10,a.field10) IS NULL