2014-09-25 73 views
2

我在那里的客户已经在某些情况下,这是造成问题被多次添加一个庞大的客户数据库。我可以使用查询来标识完全匹配的记录,但某些记录具有轻微变化,如不同的地址或给定名称。SQL - 查找重复的领域和计算多少场匹配

我想查询在10个领域,一些记录将匹配所有10这显然是一个重复的,尽管其他领域可能只匹配5场与另一个记录,需要进一步调查。因此,我想创建一个结果集,其中包含有多少个字段已匹配的字段。基本上要创建一个可能的引擎盖评级,结果是实际匹配。所有10个将是一个明确的重复,但5只会是一个可能的重复。

一些只会匹配邮编和名字这一般可以打折。

事情是这样的帮助,但因为它只返回其中明确匹配所有3条记录它不是真的有用,由于数据的绝对数量。

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

有很多方法可以做到这一点。您可以执行常规加入标准,然后为每个列使用一个案例表达式。情况下,当table1.field1 = table2.field2然后1结束...重复每列。然后,您可以轻松分辨出匹配的列数。 – 2014-09-25 19:59:07

+0

潜在客户的数量有多大,数以百万计? – ErstwhileIII 2014-09-25 20:05:52

+0

需要说明的是:您希望将每行与其他所有行进行比较,以确定有多少列是完全匹配的“计数”?你在谈论一个交叉连接(主键不一样,因为那些将始终是完整的匹配),如果有一千多行,这将非常昂贵。 – pmbAustin 2014-09-25 20:07:58

回答

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 

更新:从原始表获取行,使用加入它针对#duplicated_rows在比较列时将NULL视为通配符。

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 
+0

谢谢匿名,它的作品很好,我能够达到预期的效果。 – 2014-09-26 10:21:00

+0

是否有可能返回上述查询中匹配的客户ID字段。客户ID始终是唯一的,这对于返回这些值也很有帮助。 – 2014-09-26 10:24:10

+0

非常感谢,这有所帮助。当我运行与相交查询它需要一个年龄,我离开它运行,1.5小时后它返回一些结果,但仍然运行,所以我停了下来。我也松了duplicate_column_count有没有办法在结果中保留这个。 – 2014-09-26 20:08:55

0

你可以尝试像

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

field1通过field10被下令 “最具识别性/重要” 到最少。

+0

这可以帮助正确的,但我希望为描述的速率在每个与匹配字段的计数复制创建查询交叉联接。由于我们需要定期将数据库提交给监管机构,因此在每次提交前都需要检查表格以确保不存在重复。由于其相当大,我们需要确保这是尽可能的用户友好。 – 2014-09-25 20:34:16

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) 

这个查询将返回成千上万的记录,但我在记录与精确匹配字段