USP_CONSTITUENT_FUZZY_LOOKUP
Perform constituent fuzzy lookup using global parameter settings
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@TRANSACTIONTYPE | nvarchar(512) | IN | |
@EMAILADDRESS_EMAILADDRESS | UDT_EMAILADDRESS | IN | |
@LASTNAME | nvarchar(100) | IN | |
@FIRSTNAME | nvarchar(50) | IN | |
@MAIDENNAME | nvarchar(100) | IN | |
@MIDDLENAME | nvarchar(50) | IN | |
@ADDRESS_ADDRESSBLOCK | nvarchar(150) | IN | |
@ADDRESS_CITY | nvarchar(100) | IN | |
@ADDRESS_COUNTRYID | uniqueidentifier | IN | |
@ADDRESS_STATEID | uniqueidentifier | IN | |
@ADDRESS_POSTCODE | nvarchar(12) | IN | |
@PHONE_NUMBER | nvarchar(100) | IN | |
@BIRTHDATE | UDT_FUZZYDATE | IN | |
@GENDERCODE | tinyint | IN | |
@LOOKUPID | nvarchar(20) | IN | |
@INACTIVE | bit | IN | |
@DECEASED | bit | IN | |
@MAXROWS | int | IN | |
@TITLECODEID | uniqueidentifier | IN | |
@INCLUDENICKNAME | bit | IN | |
@INCLUDEALIAS | bit | IN | |
@ISORGANIZATION | bit | IN | |
@EventID | uniqueidentifier | IN |
Definition
Copy
CREATE PROCEDURE [dbo].[USP_CONSTITUENT_FUZZY_LOOKUP]
(
@TRANSACTIONTYPE nvarchar(512) = 'FAF Registration'
,@EMAILADDRESS_EMAILADDRESS dbo.UDT_EMAILADDRESS = ''
,@LASTNAME nvarchar(100) = ''
,@FIRSTNAME nvarchar(50) = ''
,@MAIDENNAME nvarchar(100) = ''
,@MIDDLENAME nvarchar(50) = ''
,@ADDRESS_ADDRESSBLOCK nvarchar(150) = ''
,@ADDRESS_CITY nvarchar(100) = ''
,@ADDRESS_COUNTRYID uniqueidentifier= null
,@ADDRESS_STATEID uniqueidentifier= null
,@ADDRESS_POSTCODE nvarchar(12) = ''
,@PHONE_NUMBER nvarchar(100) = ''
,@BIRTHDATE AS dbo.UDT_FUZZYDATE = ''
,@GENDERCODE tinyint = null
,@LOOKUPID nvarchar(20) = ''
,@INACTIVE bit = 0
,@DECEASED bit = 0
,@MAXROWS integer = 100
,@TITLECODEID uniqueidentifier = null
,@INCLUDENICKNAME bit = 0
,@INCLUDEALIAS bit = 0
,@ISORGANIZATION bit = 0 -- Added to filter config parameters for organization
,@EventID uniqueidentifier = null
)
AS
BEGIN
SET NOCOUNT ON;
-- Declare global configuration parameters
DECLARE
@LEFTPOSTCODECOUNT AS int
,@OVERALLMATCHTHRESHOLD AS numeric(5, 2)
,@CRITERIACOUNT AS smallint
,@CONFIG_EMAIL AS bit = 0
,@CONFIG_LASTNAMEORORG AS bit = 0
,@CONFIG_FIRSTNAME AS bit = 0
,@CONFIG_MAIDENNAME AS bit = 0
,@CONFIG_MIDDLENAME AS bit = 0
,@CONFIG_ADDRESS AS bit = 0
,@CONFIG_CITY AS bit = 0
,@CONFIG_COUNTRY AS bit = 0
,@CONFIG_STATE AS bit = 0
,@CONFIG_ZIP AS bit = 0
,@CONFIG_ANYPHONE AS bit = 0
,@CONFIG_BIRTHDATE AS bit = 0
,@CONFIG_GENDER AS bit = 0
,@CONFIG_LOOKUP_ID AS bit = 0
,@CONFIG_INACTIVE AS bit = 0
,@CONFIG_DECEASED AS bit = 0
,@CONFIG_TITLE AS bit = 0
,@CONFIG_INCLUDENICKNAME AS bit = 0
,@CONFIG_INCLUDEALIAS AS bit = 0
,@TEMPID AS uniqueidentifier = newid();
-- Get global configuration parameters
-- Organization filter was added to exclude non related config parameters
SELECT
@LEFTPOSTCODECOUNT = LEFTPOSTCODECOUNT
,@OVERALLMATCHTHRESHOLD= OVERALLMATCHTHRESHOLD
,@CONFIG_EMAIL = [EMAIL]
,@CONFIG_LASTNAMEORORG = [LASTNAMEORORG]
,@CONFIG_FIRSTNAME = CASE WHEN @ISORGANIZATION=1 THEN 0 ELSE [FIRSTNAME] END
,@CONFIG_MAIDENNAME = CASE WHEN @ISORGANIZATION=1 THEN 0 ELSE [MAIDENNAME] END
,@CONFIG_MIDDLENAME = CASE WHEN @ISORGANIZATION=1 THEN 0 ELSE [MIDDLENAME] END
,@CONFIG_ADDRESS = [ADDRESS]
,@CONFIG_CITY = CASE WHEN @ISORGANIZATION=1 THEN 0 ELSE [CITY] END
,@CONFIG_COUNTRY = CASE WHEN @ISORGANIZATION=1 THEN 0 ELSE [COUNTRY] END
,@CONFIG_STATE = CASE WHEN @ISORGANIZATION=1 THEN 0 ELSE [STATE] END
,@CONFIG_ZIP = CASE WHEN @ISORGANIZATION=1 THEN 0 ELSE [ZIP] END
,@CONFIG_ANYPHONE = [ANYPHONE]
,@CONFIG_BIRTHDATE = CASE WHEN @ISORGANIZATION=1 THEN 0 ELSE [BIRTHDATE] END
,@CONFIG_GENDER = CASE WHEN @ISORGANIZATION=1 THEN 0 ELSE [GENDER] END
,@CONFIG_LOOKUP_ID = CASE WHEN @ISORGANIZATION=1 THEN 0 ELSE [LOOKUP_ID] END
,@CONFIG_INACTIVE = CASE WHEN @ISORGANIZATION=1 THEN 0 ELSE [INACTIVE] END
,@CONFIG_DECEASED = CASE WHEN @ISORGANIZATION=1 THEN 0 ELSE [DECEASED] END
,@CONFIG_TITLE = CASE WHEN @ISORGANIZATION=1 THEN 0 ELSE [TITLE] END
,@CONFIG_INCLUDENICKNAME = CASE WHEN @ISORGANIZATION=1 THEN 0 ELSE [INCLUDENICKNAME] END
,@CONFIG_INCLUDEALIAS = CASE WHEN @ISORGANIZATION=1 THEN 0 ELSE [INCLUDEALIAS] END
FROM dbo.CONSTITUENTDUPLICATESEARCHSETTINGS (NOLOCK)
WHERE [TRANSACTIONTYPE] = @TRANSACTIONTYPE;
IF LEN(@ADDRESS_POSTCODE) >0
SELECT @ADDRESS_POSTCODE = LEFT(@ADDRESS_POSTCODE ,@LEFTPOSTCODECOUNT)+'%';
-- Calculate criteria count, criteria values are either 0 or 1
-- When config is set and the value is passed then 1 otherwise 0
SELECT @CRITERIACOUNT = (
CASE WHEN (@CONFIG_LASTNAMEORORG=1 AND LEN(@LASTNAME)>0) THEN 1 ELSE 0 END
+ CASE WHEN (@CONFIG_FIRSTNAME =1 AND LEN(@FIRSTNAME)>0) THEN 1 ELSE 0 END
+ CASE WHEN (@CONFIG_MAIDENNAME =1 AND LEN(@MAIDENNAME)>0) THEN 1 ELSE 0 END
+ CASE WHEN (@CONFIG_MIDDLENAME =1 AND LEN(@MIDDLENAME)>0) THEN 1 ELSE 0 END
+ CASE WHEN (@CONFIG_ADDRESS =1 AND LEN(@ADDRESS_ADDRESSBLOCK)>0) THEN 1 ELSE 0 END
+ CASE WHEN (@CONFIG_CITY =1 AND LEN(@ADDRESS_CITY)>0) THEN 1 ELSE 0 END
+ CASE WHEN (@CONFIG_ANYPHONE =1 AND LEN(@PHONE_NUMBER)>0) THEN 1 ELSE 0 END
+ CASE WHEN (@CONFIG_BIRTHDATE =1 AND LEN(@BIRTHDATE)>0) THEN 1 ELSE 0 END
+ CASE WHEN (@CONFIG_LOOKUP_ID =1 AND LEN(@LOOKUPID)>0) THEN 1 ELSE 0 END
+ CASE WHEN (@CONFIG_EMAIL =1 AND LEN(@EMAILADDRESS_EMAILADDRESS)>0) THEN 1 ELSE 0 END
);
IF @CRITERIACOUNT=0
RETURN;
DECLARE @AUTOMATCHSITEMODECODE TINYINT;
SELECT @AUTOMATCHSITEMODECODE = AUTOMATCHSITEMODECODE
FROM dbo.EVENTEXTENSION EX (nolock)
WHERE EX.EVENTID = @EventID;
WITH [CTE_ALL_CONSTITUENTS]
AS
(
SELECT DISTINCT
C.ID AS CONSTITUENTID
,A.ID AS ADDRESSID
,CASE WHEN DC.ID IS NULL THEN 0 ELSE 1 END as ISDECEASED
,C.KEYNAME
,C.NAME
,C.FIRSTNAME
,C.MAIDENNAME
,C.MIDDLENAME
,ISNULL(A.COUNTRYID,@TEMPID) AS [COUNTRYID]
,ISNULL(A.STATEID,@TEMPID) AS [STATEID]
,A.[ADDRESSBLOCK]
,A.[CITY]
,ISNULL(A.[POSTCODE],SPACE(0)) AS [POSTCODE] -- Constituent with no address case
,C.[BIRTHDATE]
,C.[GENDERCODE]
,P.[NUMBER] AS [PHONE_NUMBER]
,C.LOOKUPID
,C.ISINACTIVE
,C.NICKNAME
,ISNULL(C.TITLECODEID,@TEMPID) as [TITLECODEID]
,ISNULL(C.TITLE2CODEID,@TEMPID) as [TITLE2CODEID]
,EA.EMAILADDRESS
FROM [dbo].[CONSTITUENT] (NOLOCK) C
LEFT JOIN [dbo].[ADDRESS] (NOLOCK) A
ON A.CONSTITUENTID = C.ID
LEFT JOIN [dbo].[COUNTRY] (NOLOCK) CO
ON A.COUNTRYID = CO.ID
LEFT JOIN [dbo].[STATE] (NOLOCK) S
ON A.STATEID = S.ID
LEFT JOIN [dbo].[PHONE] (NOLOCK) P
ON C.ID = P.CONSTITUENTID
LEFT JOIN [dbo].[DECEASEDCONSTITUENT] (NOLOCK) DC
ON C.ID = DC.ID
LEFT JOIN [dbo].[EMAILADDRESS] EA (NOLOCK)
ON C.ID = EA.CONSTITUENTID
WHERE C.ISCONSTITUENT = 1 -- Constituents only
AND C.ISGROUP = 0 -- Exclude groups
AND C.ISORGANIZATION = 0 -- Exclude organization
-- Filter constituents by event auto-match site
AND (
(@AUTOMATCHSITEMODECODE = 0)
or
(
(@AUTOMATCHSITEMODECODE = 1 and exists
(select 1 from dbo.UFN_SITEID_MAPFROM_CONSTITUENTID(C.ID) CONTSITE
where CONTSITE.SITEID is null)
)
or
(@AUTOMATCHSITEMODECODE = 2 and exists
(select 1 from dbo.UFN_SITEID_MAPFROM_CONSTITUENTID(C.ID) CONTSITE
where CONTSITE.SITEID in (
select EVENTAUTOMATCHSITE.SITEID
from dbo.[EVENT]
left outer join dbo.EVENTAUTOMATCHSITE on EVENTAUTOMATCHSITE.EVENTID = [EVENT].ID
where [EVENT].ID = @EVENTID) )
)
)
)
)
-- Filter constituents by email or last name
,[CTE_CONSTITUENTS]
AS
(
select *
from [CTE_ALL_CONSTITUENTS]
where KEYNAME = @LASTNAME
AND ISNULL(@LASTNAME, '') <> ''
union
select *
from [CTE_ALL_CONSTITUENTS]
where EMAILADDRESS = @EMAILADDRESS_EMAILADDRESS
and isnull(@EMAILADDRESS_EMAILADDRESS, '') <> ''
)
-- Constituents with exact matched emails
,[CTE_CONSTITUENTS_WITH_MATCH_EMAILS]
as
(
SELECT
[CONSTITUENTID]
,[FIRSTNAME]
,[KEYNAME] AS [LASTNAME]
,EMAILADDRESS
,100 AS [MATCHPERCENTAGE]
FROM [CTE_CONSTITUENTS]
where EMAILADDRESS = @EMAILADDRESS_EMAILADDRESS
and (@CONFIG_EMAIL=1 AND LEN(@EMAILADDRESS_EMAILADDRESS)>0)
)
,[CTE_CONSTITUENTS_WITH_OTHER_MATCH]
as
(
SELECT
[CONSTITUENTID],
[NAME],
[KEYNAME],
[FIRSTNAME],
[MAIDENNAME],
[CITY],
[PHONE_NUMBER],
[BIRTHDATE],
[LOOKUPID],
[ADDRESSBLOCK],
[POSTCODE],
[COUNTRYID],
[STATEID],
[GENDERCODE],
[TITLECODEID],
[TITLE2CODEID],
[MIDDLENAME],
[ISDECEASED],
[NICKNAME]
FROM [CTE_CONSTITUENTS]
WHERE ISINACTIVE = CASE
WHEN @CONFIG_INACTIVE =1 AND @INACTIVE=1 THEN ISINACTIVE
ELSE 0
END
AND [ISDECEASED] = CASE WHEN (@CONFIG_DECEASED =1 AND @DECEASED=1) THEN [ISDECEASED]
ELSE 0
END
-- Postcode may be null or configured and used for auto match
AND [POSTCODE] LIKE CASE
WHEN LEN([POSTCODE])=0 THEN SPACE(0)
WHEN (@CONFIG_ZIP=1 AND LEN(@ADDRESS_POSTCODE)>0) THEN @ADDRESS_POSTCODE
ELSE [POSTCODE]
END
AND [COUNTRYID] = CASE
WHEN (@CONFIG_COUNTRY=1 AND @ADDRESS_COUNTRYID IS NOT NULL) THEN @ADDRESS_COUNTRYID
ELSE [COUNTRYID]
END
AND [STATEID] = CASE
WHEN (@CONFIG_STATE=1 AND @ADDRESS_STATEID IS NOT NULL) THEN @ADDRESS_STATEID
ELSE [STATEID]
END
AND [GENDERCODE] = CASE
WHEN (@CONFIG_GENDER=1 AND @GENDERCODE IS NOT NULL) THEN @GENDERCODE
ELSE [GENDERCODE]
END
AND (
@CONFIG_TITLE = 0 or
@TITLECODEID is null or
[TITLECODEID] = @TITLECODEID or
[TITLE2CODEID] = @TITLECODEID
)
)
,[CTE_CONSTITUENTS_WITH_OTHER_MATCH_FILTERED]
as (
select
*,
[KEYNAME] as [COMPAREKEYNAME],
[FIRSTNAME] as [COMPAREFIRSTNAME],
[MIDDLENAME] as [COMPAREMIDDLENAME]
from [CTE_CONSTITUENTS_WITH_OTHER_MATCH]
union all
select C.*,
[ALIAS].[KEYNAME] as [COMPAREKEYNAME],
[ALIAS].[FIRSTNAME] as [COMPAREFIRSTNAME],
[ALIAS].[MIDDLENAME] as [COMPAREMIDDLENAME]
from [CTE_CONSTITUENTS_WITH_OTHER_MATCH] C
INNER JOIN dbo.[ALIAS]
on C.[CONSTITUENTID] = [ALIAS].[CONSTITUENTID]
WHERE @CONFIG_INCLUDEALIAS = 1
union all
select *,
[KEYNAME] as [COMPAREKEYNAME],
[NICKNAME] as [COMPAREFIRSTNAME],
[MIDDLENAME] as [COMPAREMIDDLENAME]
from [CTE_CONSTITUENTS_WITH_OTHER_MATCH]
WHERE @CONFIG_INCLUDENICKNAME = 1
)
,[CTE_CONSITUENTS_SCORES]
AS
(
SELECT
*
,[dbo].[UFN_CONSITTUENT_FUZZY_LOOKUP_SCORE](@CONFIG_LASTNAMEORORG ,[COMPAREKEYNAME] ,@LASTNAME) AS [LASTNAME_SCORE]
,[dbo].[UFN_CONSITTUENT_FUZZY_LOOKUP_SCORE](@CONFIG_FIRSTNAME ,[COMPAREFIRSTNAME] ,@FIRSTNAME) AS [FIRSTNAME_SCORE]
,[dbo].[UFN_CONSITTUENT_FUZZY_LOOKUP_SCORE](@CONFIG_MAIDENNAME ,[MAIDENNAME] ,@MAIDENNAME) AS [MAIDENNAME_SCORE]
,[dbo].[UFN_CONSITTUENT_FUZZY_LOOKUP_SCORE](@CONFIG_MIDDLENAME ,[COMPAREMIDDLENAME] ,@MIDDLENAME) AS [MIDDLENAME_SCORE]
,[dbo].[UFN_CONSITTUENT_FUZZY_LOOKUP_SCORE](@CONFIG_CITY ,[CITY] ,@ADDRESS_CITY) AS [CITY_SCORE]
,[dbo].[UFN_CONSITTUENT_FUZZY_LOOKUP_SCORE](@CONFIG_ANYPHONE ,[PHONE_NUMBER] ,@PHONE_NUMBER) AS [PHONE_SCORE]
,[dbo].[UFN_CONSITTUENT_FUZZY_LOOKUP_SCORE](@CONFIG_BIRTHDATE ,[BIRTHDATE] ,@BIRTHDATE) AS [BIRTHDATE_SCORE]
,[dbo].[UFN_CONSITTUENT_FUZZY_LOOKUP_SCORE](@CONFIG_LOOKUP_ID ,[LOOKUPID] ,@LOOKUPID) AS [LOOKUPID_SCORE]
,[dbo].[UFN_CONSITTUENT_FUZZY_LOOKUP_SCORE](@CONFIG_ADDRESS ,[ADDRESSBLOCK] ,@ADDRESS_ADDRESSBLOCK) AS [ADDRESSBLOCK_SCORE]
FROM [CTE_CONSTITUENTS_WITH_OTHER_MATCH_FILTERED]
)
-- CTE with computed match percentage
,[CTE_LOOKUP_RESULT]
AS
(
SELECT
[CONSTITUENTID]
,[NAME]
,[FIRSTNAME]
,[KEYNAME] AS [LASTNAME]
,((([LASTNAME_SCORE]
+ [FIRSTNAME_SCORE]
+ [MAIDENNAME_SCORE]
+ [MIDDLENAME_SCORE]
+ [ADDRESSBLOCK_SCORE]
+ [CITY_SCORE]
+ [PHONE_SCORE]
+ [BIRTHDATE_SCORE]
)/@CRITERIACOUNT)*100) AS MATCHPERCENTAGE
FROM [CTE_CONSITUENTS_SCORES]
)
------ Final resultset
SELECT DISTINCT TOP(@MAXROWS) *
FROM
(
SELECT [CONSTITUENTID]
,[FIRSTNAME]
,[LASTNAME]
,[MATCHPERCENTAGE]
FROM [CTE_CONSTITUENTS_WITH_MATCH_EMAILS]
UNION
SELECT [CONSTITUENTID]
,[FIRSTNAME]
,[LASTNAME]
,[MATCHPERCENTAGE]
FROM [CTE_LOOKUP_RESULT]
WHERE [MATCHPERCENTAGE] >= @OVERALLMATCHTHRESHOLD
) FINALRESULT
ORDER BY [MATCHPERCENTAGE] DESC;
END