당신은 분명히 다른 경기의 무게를 달아야합니다. SSN이 일치하면 꽤 좋은 징후입니다. firstName이 일치하면 기본적으로 쓸모가 없습니다.
링크 된 소리 나는 문자열 일치 알고리즘과 결합 된 일치 항목의 가중치를 기반으로 점수를 매길 수 있습니다. 다음은 T-SQL에서 수행 한 예제입니다. 문제를 해결하기 위해 오라클에 포팅해야합니다.
--Score Threshold to be returned
DECLARE @Threshold DECIMAL(5,5) = 0.60
--Weights to apply to each column match (0.00 - 1.00)
DECLARE @Weight_FirstName DECIMAL(5,5) = 0.10
DECLARE @Weight_LastName DECIMAL(5,5) = 0.40
DECLARE @Weight_SSN DECIMAL(5,5) = 0.40
DECLARE @Weight_Gender DECIMAL(5,5) = 0.10
DECLARE @NewStuff TABLE (ID INT IDENTITY PRIMARY KEY, FirstName VARCHAR(MAX), LastName VARCHAR(MAX), SSN VARCHAR(11), Gender VARCHAR(1))
INSERT INTO @NewStuff
(FirstName, LastName, SSN, Gender)
VALUES
('Ben','Sanders','234-62-3442','M')
DECLARE @OldStuff TABLE (ID INT IDENTITY PRIMARY KEY, FirstName VARCHAR(MAX), LastName VARCHAR(MAX), SSN VARCHAR(11), Gender VARCHAR(1))
INSERT INTO @OldStuff
(FirstName, LastName, SSN, Gender)
VALUES
('Ben','Stickler','234-62-3442','M'), --3/4 Match
('Albert','Sanders','523-42-3441','M'), --2/4 Match
('Benne','Sanders','234-53-2334','F'), --2/4 Match
('Ben','Sanders','234623442','M'), --SSN has no dashes
('Ben','Sanders','234-62-3442','M') --perfect match
SELECT
'NewID' = ns.ID,
'OldID' = os.ID,
'Weighted Score' =
(CASE WHEN ns.FirstName = os.FirstName THEN @Weight_FirstName ELSE 0 END)
+
(CASE WHEN ns.LastName = os.LastName THEN @Weight_LastName ELSE 0 END)
+
(CASE WHEN ns.SSN = os.SSN THEN @Weight_SSN ELSE 0 END)
+
(CASE WHEN ns.Gender = os.Gender THEN @Weight_Gender ELSE 0 END)
,
'RAW Score' = CAST(
((CASE WHEN ns.FirstName = os.FirstName THEN 1 ELSE 0 END)
+
(CASE WHEN ns.LastName = os.LastName THEN 1 ELSE 0 END)
+
(CASE WHEN ns.SSN = os.SSN THEN 1 ELSE 0 END)
+
(CASE WHEN ns.Gender = os.Gender THEN 1 ELSE 0 END)) AS varchar(MAX))
+
'/4',
os.FirstName ,
os.LastName ,
os.SSN ,
os.Gender
FROM @NewStuff ns
--make sure that at least one item matches exactly
INNER JOIN @OldStuff os ON
os.FirstName = ns.FirstName OR
os.LastName = ns.LastName OR
os.SSN = ns.SSN OR
os.Gender = ns.Gender
where
(CASE WHEN ns.FirstName = os.FirstName THEN @Weight_FirstName ELSE 0 END)
+
(CASE WHEN ns.LastName = os.LastName THEN @Weight_LastName ELSE 0 END)
+
(CASE WHEN ns.SSN = os.SSN THEN @Weight_SSN ELSE 0 END)
+
(CASE WHEN ns.Gender = os.Gender THEN @Weight_Gender ELSE 0 END)
>= @Threshold
ORDER BY ns.ID, 'Weighted Score' DESC
그리고 출력은 다음과 같습니다.
NewID OldID Weighted Raw First Last SSN Gender
1 5 1.00000 4/4 Ben Sanders 234-62-3442 M
1 1 0.60000 3/4 Ben Stickler 234-62-3442 M
1 4 0.60000 3/4 Ben Sanders 234623442 M
그런 다음 가능한 각 일치의 유효성을 평가하기 위해 몇 가지 사후 처리를 수행해야합니다. 가중 점수를 얻기 위해 1.00을 얻은 경우 두 가지를 얻지 않는 이상 올바른 일치라고 가정 할 수 있습니다. 성과 이름 (SSN) (예를 들어, 합산 된 가중치가 0.8 인 경우)이 맞는 것으로 합리적으로 확신 할 수 있습니다.
HLGEM 및 rexem과 마찬가지로 하위 쿼리가 아닌 조인을 사용하는 것이 좋습니다. 또한 아직 수행하지 않은 경우 데이터를 하나의 데이터베이스로 복사하여 성능을 향상시킬 수 있습니다. –