2015-02-09 43 views
0

我有可以有多個地址與它們相關聯的記錄,我將所有這些歸一化到一個表中,以便我可以看到屬於記錄的每個地址並識別重複項(基於地址欄1)。在SQL Server 2008表上識別重複項的行數

我想要識別的是具有相同地址兩次的記錄。我使用CTE完成了這項工作,併爲每次發生的地址添加了一個行號,但我忘記了一個重要部分。對於每個記錄,都有一個主要地址,並且該地址(如果它是重複的)應始終具有最低的行號(RN)。

請告訴我偶爾會發生的事情是我的主地址相匹配的非主地址和非主地址獲取RN = 1,我的主要獲取RN> 1

因爲我要停用這些我期待對於所有不是主要地址的RN>'1'的地址,我最終會丟失一堆結果。我添加了一個名爲'PRIMARY_ADDR'的列,但我不確定如何將此字段併入CTE中。

CREATE TABLE [dbo].[ALL_Address_Table] 
(
    [RECORD_ID] [varchar](50) NULL, 
    [EXT_ID] [varchar](50) NULL, 
    [ADDR_ID] [varchar](50) NULL, 
    [ADDR_LINE_1] [varchar](80) NULL, 
    [ADDR_LINE_2] [varchar](80) NULL, 
    [ADDR_ZIP] [varchar](50) NULL, 
    [ADDR_STATUS] [varchar](50) NULL, 
    [RN] [varchar](50) NULL, 
    [PRIMARY_ADDR] [varchar](50) NULL 
) ON [PRIMARY] 

INSERT INTO ALL_Address_Table 
    ([RECORD_ID], [EXT_ID], [ADDR_ID], [ADDR_LINE_1], [ADDR_LINE_2], [ADDR_ZIP], [ADDR_STATUS], [RN], [PRIMARY_ADDR]) 
VALUES 
    (555678, '900120', '555678-100001', '123 MAIN ST','','58865','ACTIVE','','No'), 
    (555678, '900125', '555678-100002', '123 MAIN ST','','58865','ACTIVE','','Yes'), 
    (555678, '900145', '555678-100003', '123 MAIN ST','','58865','ACTIVE','','No'), 
    (555678, '900115', '555678-100004', '500 W TRAIN ST','','58873','ACTIVE','','No') 
; 

CTE

WITH cte AS 
(
    SELECT 
     [RECORD_ID], [EXT_ID], [ADDR_ID], [ADDR_LINE_1], 
     row_number() OVER(PARTITION BY RECORD_ID, ADDR_Line_1 ORDER BY RECORD_ID) AS [rn] 
    FROM ALL_Address_Table 
) 
update ALL_Address_Table 
set RN = CTE.rn 
from CTE 
join ALL_Address_Table on CTE.RECORD_ID = ALL_Address_Table.RECORD_ID 
where CTE.ADDR_ID = All_Address_Table.ADDR_ID 

--This should not return a row with Primary_ADDR = 'Yes' but must be included in the count. 
--I cannot just remove all the primary addresses or else I will miss the ones that have 
--duplicates 

select * from ALL_Address_Table where RN > '1' 

SQL FIDDLE http://sqlfiddle.com/#!3/52a0f/3

感謝您的任何建議。

回答

1

也許你只是想將其更改爲ORDER BY RECORD_ID, PRIMARY_ADDR DESC,以便主地址獲得第一個RN時隙?不確定爲什麼RN和PRIMARY_ADDRESS是寬的varchar列。

我猜這是被扔掉的代碼,但作爲連接條件可能會更好:

inner join ALL_Address_Table 
    on CTE.ADDR_ID = All_Address_Table.ADDR_ID 

的RECORD_ID檢查看起來是多餘的。

+0

謝謝,我不知道我爲什麼試圖像改變順序那樣簡單。 – Jeremy 2015-02-09 18:47:15