2014-09-25 110 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) 

這個查詢將返回成千上萬的記錄,但我在記錄與精確匹配字段