2015-02-09 4 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') 
; 

КТР

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

Смежные вопросы