Levenshtein函数是否是正确/最佳函数,以找到两个字符串之间的最高一致性?
例如:
string1 = CCC14E0APJ
string2 = CCC14E0APJ123
我的最终结果应该说CCC14E0APJ
是CCC14E0APJ123
的主要产品。
我不能完全匹配,因为有些产品看起来像这样。
CCC14E0AP
CCC14E0APJ
CCC14E0APK
这些都是完全不同的产品。 对于找到的最长字符串,master始终是100%匹配的字符串。 对于产品abcde123,如果我的主表中有一个abcde,那就是master。如果只有abc,那就是主人。
答案 0 :(得分:4)
你不需要花哨的 How-close-is-the-string -functions,而是将字符串的开头与所有其他字符串进行比较,如果它们以相同的字符串开头。如果是这样,则较长的父越短......
使用以下查询,您将获得 ParentID ,即使在分层系统中也是如此:
DECLARE @dummy TABLE(YourID VARCHAR(100),ParentID VARCHAR(100));
INSERT INTO @dummy(YourID) VALUES
('CCC14E0AP')
,('CCC14E0APJ')
,('CCC14E0APK')
,('CCC14E0APK_1')
,('CCC14E');
WITH DependingIDs AS
(
SELECT d.ParentID
,d.YourID
,d2.YourID AS dependingID
,RANK() OVER(PARTITION BY d.YourID ORDER BY LEN(d2.YourID) DESC) AS NextLenght
FROM @dummy AS d
INNER JOIN @dummy AS d2 ON d.YourID LIKE d2.YourID + '%' AND d.YourID<>d2.YourID
)
UPDATE DependingIDs SET ParentID=dependingID
WHERE NextLenght=1;
SELECT * FROM @dummy
这是结果
YourID ParentID
CCC14E0AP CCC14E
CCC14E0APJ CCC14E0AP
CCC14E0APK CCC14E0AP
CCC14E0APK_1 CCC14E0APK
CCC14E NULL
答案 1 :(得分:3)
对于每一行,您只需使用APPLY
运算符检测最大子字符串:
DECLARE @t TABLE ( p VARCHAR(MAX) );
INSERT INTO @t
VALUES ( 'A' ),
( 'AAAA' ),
( 'AA' ),
( 'BBB' ),
( 'BBBB' ),
( 'BBBBB' ),
( 'BBBBB' ),
( 'C' )
SELECT *
FROM @t t
OUTER APPLY ( SELECT TOP 1 p
FROM @t
WHERE t.p <> p AND t.p LIKE p + '%'
ORDER BY LEN(p) DESC
) ca
输出:
A NULL
AAAA AA
AA A
BBB NULL
BBBB BBB
BBBBB BBBB
BBBBB BBBB
C NULL