Как извлечь дубликаты записей из таблицы, используя несколько полей? - PullRequest
0 голосов
/ 03 апреля 2009

Я уже проверил вопрос Удаление дубликатов записей с использованием временной таблицы , и это не достаточно далеко, чтобы помочь мне с этим вопросом:

У меня есть таблица приблизительно из 200 000 адресов, размещенных на SQL 2000 Server . Эта таблица имеет огромную проблему с дублирующимися данными в таблице, вызванными неправильным вводом данных различными сторонами на протяжении многих лет. Мне нужно вывести список дубликатов записей, чтобы я мог начать долгий процесс их очистки.

Итак, рассмотрим следующую структуру таблицы:

Table Company(   
  CompanyId NVarChar(10) Not Null Constraint PK_Locations Primary Key,   
  CompanyName NVarChar(30),   
  CompanyAddress NVarChar(30),   
  CompanyCity NVarchar(30), 
  CompanyState Char(2),   
  CompanyZip NVarChar(10),   
  DateCreated DateTime, 
  LastModified DateTime,  
  LastModifiedUser NVarChar(64) 
)

Для первого разбора я даже не буду беспокоиться о опечатках и вариациях правописания, а это будет большим кошмаром в будущем, который я даже не получил даже первой подсказки о решении.

Таким образом, для этой части запись считается дублирующейся, если несколько записей соответствуют следующим условиям:

(CompanyName Or CompanyAddress) и компанияГород и компания штата

Zip исключен, потому что во многих местах отсутствуют почтовые индексы и так много введено неверно, что если я их добавлю, это просто даст гораздо менее точный отчет.

Я понимаю, что на законных основаниях может быть несколько мест для компании в пределах одного города / штата [например, McDonalds, прямо у меня в голове], и на законном основании может быть несколько компаний по одному адресу в городе и указать [например, внутри торгового центра или офисного здания], но сейчас мы рассмотрим, что они по крайней мере требуют определенного уровня человеческого внимания, и включим их в отчет.

Совпадения на отдельных полях - это просто, но я отклеиваюсь, когда добираюсь до нескольких полей, особенно когда некоторые являются условными.

Ответы [ 3 ]

2 голосов
/ 03 апреля 2009
WITH q AS (
          SELECT Company.*,
                 ROW_NUMBER() OVER (PARTITION BY CompanyState, CompanyCity, CompanyName ORDER BY CompanyID) AS rnName,
                 ROW_NUMBER() OVER (PARTITION BY CompanyState, CompanyCity, CompanyAddress ORDER BY CompanyID) AS rnAddress
          FROM Company
          )
SELECT    *
WHERE     rnName > 1 OR rnAddress > 1

Обратите внимание, что если ваши данные будут выглядеть так:

CompanyID    CompanyName  CompanyAddress 
---------    -----------  --------------
1            McDonalds    Avenue 1
2            McDonalds    Avenue 2
3            Starbucks    Avenue 2

, тогда обе записи 2 и 3 будут удалены (что вы и просили, но, вероятно, не то, что вы хотели)

Если вы просто хотите перечислить все строки, имеющие дубликаты, введите:

SELECT  *
FROM    Company co
WHERE   EXISTS
        (
        SELECT  1
        FROM    Company cn
        WHERE   cn.CompanyState = co.CompanyState
                AND cn.CompanyCity = co.CompanyCity
                AND cn.CompanyName = co.CompanyName
                AND cn.CompanyID <> co.CompanyID
        )
        OR EXISTS
        (
        SELECT  1
        FROM    Company ca
        WHERE   ca.CompanyState = co.CompanyState
                AND ca.CompanyCity = co.CompanyCity
                AND ca.CompanyAddress = co.CompanyAddress
                AND ca.CompanyID <> co.CompanyID
        )

Это будет работать и в SQL Server 2000.

Наличие индексов для (CompanyState, CompanyCity, CompanyName) и (CompanyState, CompanyCity, CompanyAddress) значительно улучшит этот запрос.

0 голосов
/ 03 апреля 2009

Попробуйте что-то вроде этого ...

Select field1, field2, ... etc, count(*)
FROM Company,
GROUP BY field1, field2, ...
HAVING count(*) > 1

Это должно показать вам, что дублируется.

0 голосов
/ 03 апреля 2009
SELECT
     C1.CompanyID,
     C2.CompanyID
FROM
     Company C1
INNER JOIN Company C2 ON
     (C2.CompanyName = C1.CompanyName OR C2.CompanyAddress = C1.CompanyAddress) AND
     C2.CompanyCity = C1.CompanyCity AND
     C2.CompanyState = C2.CompanyState AND
     C2.CompanyID > C1.CompanyID

Если у вас три или более совпадений, они появятся в списке несколько раз. Есть разные способы справиться с этим в зависимости от того, что именно вы хотите получить от запроса.

Я также настоятельно рекомендую вам обратить внимание на более качественное кодирование внешнего интерфейса, чтобы ограничить то, как адреса попадают в вашу систему, а также обучение пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...