2016-03-29 2 views
1

Я пытаюсь сопоставить клиентов, используя три поля: FirstName, LastName, Gender и DOB. Я понимаю, что SSIS Fuzzy Lookup применим только к строкам (никогда не видел этого в документах, как говорят некоторые блоггеры), поэтому в этом сценарии я мог бы как-то использовать DOB для создания «уверенности»? Как этот инструмент сравнивает даты?SSIS Fuzzy Поиск для дат

Вот нить по этому вопросу: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/d2e53f8c-abfc-461e-9263-fd46b95247c0/ssis-fuzzy-lookup-and-dates?forum=sqlintegrationservices

+1

[Документация] (https://msdn.microsoft.com/en-CA/library/ms137786.aspx) говорит, что он будет делать точный поиск на не STR колоннах. Любые причины, по которым вы не можете преобразовать DOB в строку перед выполнением нечеткого преобразования? – ESG

+0

Спасибо, я нашел отрывок, по какой-то причине я не обнаружил, что в первом чтении: «Только входные столбцы с типами данных DT_WSTR и DT_STR могут использоваться при нечетком сопоставлении. Точное совпадение может использовать любой тип данных DTS, кроме DT_TEXT, DT_NTEXT и DT_IMAGE. " – LearnByReading

+0

@ESG:« Почему я не могу преобразовать DOB », что полностью победит цель. За этим последовали некоторые люди в той теме, которую я привел. Нечеткое совпадение не будет соответствовать «одному» на «два», скорее, оно может совпадать с «двумя» до «двух» или «twi». Он работает на основе формулы расстояния и общих опечаток и комбинаций опечаток. Преобразование цифр в строки просто не сделает ничего, потому что вы никогда не ошибетесь. – LearnByReading

ответ

2

Я много имени/поиски Добролюбова, и это действительно трудно получить право. Вы можете рассмотреть сортировку с помощью функции, аналогичной той, которая приведена ниже. Это будет в основном принимать две 8-значные даты (YYYYMMDD) и подсчитывать количество пропущенных цифр.

Например, эти пары даты имеют 1 промах соответствия цифры:

  • 1976-10-20 и 1976-01-20 (10 против 01)
  • 1976-10-20 и 1975-10 -20 (76 против 75)

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

ALTER FUNCTION dbo.BirthDateRank (@DOB1 DATE, @DOB2 DATE) 
RETURNS INT 
AS 
    BEGIN 
     -- 10/31/2016 --> 10312016 
     DECLARE @xDOB1 VARCHAR(10) = REPLACE(CONVERT(CHAR(10), @DOB1, 101), '/', ''); 
     DECLARE @xDOB2 VARCHAR(10) = REPLACE(CONVERT(CHAR(10), @DOB2, 101), '/', ''); 

     DECLARE @i INT = 0; 
     DECLARE @iRet INT = 0; 

     WHILE @i <= LEN(@xDOB1) 
     BEGIN 
      SET @iRet = @iRet + CASE WHEN SUBSTRING(@xDOB1, @i, 1) = SUBSTRING(@xDOB2, @i, 1) THEN 0 ELSE 1 END 

      SET @i = @i + 1 
     END 

     RETURN @iRet; 

    END; 
GO 
+0

Большое вам спасибо, это такое прекрасное предложение. Тем не менее, я пытаюсь проследить функцию, чтобы увидеть, что она делает; так это возвращает число несоответствующих цифр? Например: 1945-02-23 и 1944-03-23 ​​возвращает ДВА, потому что 45 против 44 имеет одно несоответствие, а 02 против 03 - другое? Благодаря! – LearnByReading

+0

Вы поняли! Просто помните, что это лучше всего для сортировки меньших наборов данных, а не миллионов строк. –

+0

извините, не знаю, почему я не выбрал лучший ответ раньше – LearnByReading

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