我有一个庞大的客户数据库,在某些情况下,客户已多次添加,导致问题。我能够使用查询来识别完全匹配的记录,尽管有些记录有轻微的变化,例如不同的地址或给定的名称。
我想查询10个字段,有些记录将匹配所有10个显然是重复的记录,尽管其他字段可能只匹配5个字段与另一个记录并需要进一步调查。因此,我想创建一个结果集,其中包含一个计数已匹配的字段数的字段。基本上,为了创建可能的罩的评级,结果是实际匹配。所有10个都是明确的副本,但5个只是可能的副本。
有些只会匹配POSTCODE和FIRSTNAME,通常可以打折。
这样的东西会有所帮助,因为它只返回在所有3条记录上明确匹配的记录,由于数据量庞大,它们并不真正有用。
SELECT field1,field2,field3, count(*)
FROM table_name
GROUP BY field1,field2,field3
HAVING count(*) > 1
答案 0 :(得分:0)
您可以尝试类似
的内容Select field1, field2, field3, ... , field10, count(1)
from customerdatabase
group by field1, field2, field3, ... , field10
order by field1, field2, field3, ... , field10
field1
到field10
按“最可识别/最重要”的顺序排列。
答案 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