Адреса, хранящиеся на SQL-сервере, имеют много небольших изменений (ошибок). - PullRequest
1 голос
/ 07 января 2011

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

Пример данных

CompanyCode   CompanyName                     Addr1                City         State   Zip
10033         UNITED DIE  CUTTING & FINISHIN  3610 HAMILTON AVE    CLEVELAND    Ohio    44114
10033         UNITED DIE CUTTING & FINISHING  3610 HAMILTON AVE    CLEVELAND    Ohio    44114
10033         UNITED DIE CUTTING & FINISHING  3610 HAMILTON AVE.   CLEVELAND    Ohio    44114
10033         UNITED DIE CUTTING & FINISHING  3610 HAMILTON AVENUE CLEVELAND    Ohio    44114
10033         UNITED DIECUTTING & FINISHING   3610 HAMILTON AVE    CLEVELAND    Ohio    44144
10033         UNITED FINISHING                3610 HAMILTON AVE    CLEVLAND     Ohio    44114
10033         UNITED FINISHING & DIE CUTTING  3610 HAMILTON AVE    CLEVELAND    Ohio    44114

И все, что яхочу это 1 запись.Есть ли какой-нибудь способ, которым я могу получить "Среднюю" запись?То есть, если в большинстве записей вместо CLEVLAND указано CLEVELAND, я хочу, чтобы в моей 1 записи говорилось CLEVELAND.Есть ли способ сопоставить эти данные с тем, что я ищу?

Желаемый вывод

 CompanyCode   CompanyName                     Addr1                City         State   Zip
 10033         UNITED DIE CUTTING & FINISHING  3610 HAMILTON AVE    CLEVELAND    Ohio    44114

Ответы [ 3 ]

2 голосов
/ 07 января 2011

Вы собираетесь бороться.Лично я думаю, что я бы подумал о том, чтобы иметь процесс, который пытается обновить данные в базе данных и исправить их.

Вы можете изменить систему, которая вводит данные (или, если это невозможно, иметь внешний процесс, которыйпробегает данные, как только они попадают в базу данных), что делает что-то вроде следующего:

  1. Против известных списков таких вещей, как города / штаты / страны и т. д. для обнаружения опечаток.регулярные ошибки и сокращения.Например, "Проспект" / "Пр."или "улица" / "св."и нормализует значения.
  2. Измените систему ввода для выполнения такого рода проверки и / или предоставьте пользователям интерфейс поиска / проверки адреса, который позволяет затем искать адрес по некоторым известным значениям (почтовый индекс / почтовый индекс).код и т. д.)Такие данные можно купить у разных поставщиков в зависимости от того, где вы находитесь.

Если все это работает (я сомневаюсь, что вы получите 100%, если не предоставите механизм, с помощью которого эти вещи, которые могутне будут автоматически исправлены помечены как вмешательство человека), тогда ваши отчеты будут такими же простыми, как SELECT DISTINCT ...

1 голос
/ 07 января 2011

Надеюсь, это разовая работа?Это невозможно, если вы не можете объяснить (в терминах SQL), почему первая запись - это то, что вам нужно.В качестве временного решения я бы предложил следующий запрос

select C1.* from Company C1, 
(select CompanyCode, min(CompanyName) as CompanyNameSelected 
   from Company
   group by CompanyCode) C2
where 
   C1.CompanyCode = C2.CompanyCode and 
   C1.CompanyName = C2.CompanyNameSelected;

Вы можете использовать любую из функций агрегирования вместо min (возвращая, конечно, CompanyName), или даже написать собственную хранимую функцию, но единственноенеобходимо - вы должны объяснить на языке запросов, почему запись # 1 лучше, чем # 2.

0 голосов
/ 07 января 2011

Вам нужно использовать подзапросы в операторе выбора Попробуйте этот запрос:

 select CompanyCode,
    (select top 1 CompanyName from Table1 where CompanyCode=X.CompanyCode 
     group by CompanyName order by count(*) desc) CompanyName,
    (select top 1 Addr1 from Table1 where CompanyCode=X.CompanyCode 
     group by Addr1 order by count(*) desc) Addr1,
    (select top 1 City from Table1 where CompanyCode=X.CompanyCode 
     group by City order by count(*) desc) City,
    (select top 1 State from Table1 where CompanyCode=X.CompanyCode 
     group by State order by count(*) desc) State,
    (select top 1 Zip from Table1 where CompanyCode=X.CompanyCode 
     group by Zip order by count(*) desc) Zip
from    Table1 X
group by CompanyCode
...