2016-03-29 16 views
1

İstemcileri üç alanı kullanarak eşleştirmeye çalışıyorum: Ad, Soyadı, Cinsiyet ve DOB. SSIS Bulanık Arama'nın sadece dizeler için geçerli olduğu anlayışı (sadece bazı blogcular böyle bir belgede görmediler) bu senaryoda DOB'u bir şekilde “güven” oluşturmak için kullanabilir miyim? Bu araç tarihleri ​​nasıl karşılaştırır? İşte SSIS Bulanık Arama için tarihler

bu konuda bir iplik: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/d2e53f8c-abfc-461e-9263-fd46b95247c0/ssis-fuzzy-lookup-and-dates?forum=sqlintegrationservices

+1

[Belge] (https://msdn.microsoft.com/en-CA/library/ms137786.aspx) dışı STR sütunlarda tam arama yapacak söylüyor. Bulanık dönüşümü yapmadan önce DOB'u bir dizeye dönüştürememenin herhangi bir nedeni var mı? – ESG

+0

Teşekkür ederim, ben alıntıyı buldum, bir sebepten dolayı bunu ilk okumada bulamadım: "Sadece DT_WSTR ve DT_STR veri tiplerine sahip giriş sütunları bulanık eşlemede kullanılabilir. Tam eşleme, herhangi bir DTS veri türü dışında kullanılabilir. DT_TEXT, DT_NTEXT ve DT_IMAGE. " – LearnByReading

+0

@ESG:" neden DOB'u dönüştüremiyorum ", bu amacı tamamen ortadan kaldıracak. Bunu, bahsettiğim iş parçasındaki bazı insanlar izledi. Bulanık eşleşme "bir" ile "iki" arasında eşleşmez, daha ziyade "iki" ile "iki" ya da "twi" ye eşleşebilir. Uzaklık formülüne ve yaygın yazım hatalarına ve yazım hatası kombinasyonlarına dayanarak çalışır. Rakamları dizgeye dönüştürmek, sadece bir şey yapmazsınız çünkü asla bir hata yapmazsınız. – LearnByReading

cevap

2

Ben Ad/DOB aramaların çok yapmak ve doğru almak gerçekten çok zor. Aşağıdakine benzer bir işlev kullanarak sıralama yapmayı düşünebilirsiniz. Bu, temel olarak iki 8 basamaklı tarih (YYYYMMDD) alır ve hangola eşleştirilen hanelerin sayısını sayar. (01 karşı 10)

  • 1976-10-20 ve 1976-01-20
  • 1976-10-20 ve 1975-10:

    Örneğin

    bu tarih çiftleri 1 Bayan eşlemeli rakama sahip Bu sıralama için iyidir ele ne kadar verilere bağlı olarak

-20 (76 vs 75), ancak (aka öncelikle en iyi eşleşmeyi koyarak) (dahil hiçbir indeksleme olmadığından) değil filtreleme için.

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

Çok teşekkür ederim, bu harika bir öneri. Bununla birlikte, ne yaptığını görmek için işlevi izlemeye çalışıyorum; Bu, eşleşmeyen basamak sayısını döndürür? Örneğin: 1945-02-23 ve 1944-03-23 ​​İKİ döndürür, çünkü 45'e karşılık 44'ün bir yanlış eşleşmesi vardır ve 02'ye karşılık 03'ü diğerine sahiptir? Teşekkürler! – LearnByReading

+0

Anladın! Bunun sadece milyonlarca satır değil, daha küçük veri kümelerini sıralamak için en iyisi olduğunu unutmayın. –

+0

üzgünüm, neden daha önce en iyi cevabı seçmemiştim – LearnByReading