获得两个字符串之间的最高一致性
Get the highest conformity between two strings
Levenshtein 函数是 correct/best 函数,用于查找两个字符串之间的最高一致性吗?
例如:
string1 = CCC14E0APJ
string2 = CCC14E0APJ123
我的最终结果应该是 CCC14E0APJ
是 CCC14E0APJ123
的杰作。
我不能做完全匹配,因为有些产品看起来像这样。
CCC14E0AP
CCC14E0APJ
CCC14E0APK
它们都是完全不同的产品。
master 始终是找到的最长字符串的 100% 匹配字符串。
对于产品abcde123,如果我的mastertable里面有abcde,那就是master。只有abc才是高手
您不需要花哨的如何关闭字符串函数,而是将字符串的开头与所有其他字符串进行比较,如果它们以相同的字符串。如果是这样,较短的是较长的 parent...
通过以下查询,您将获得 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
对于每一行,您只需使用 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
Levenshtein 函数是 correct/best 函数,用于查找两个字符串之间的最高一致性吗?
例如:
string1 = CCC14E0APJ
string2 = CCC14E0APJ123
我的最终结果应该是 CCC14E0APJ
是 CCC14E0APJ123
的杰作。
我不能做完全匹配,因为有些产品看起来像这样。
CCC14E0AP
CCC14E0APJ
CCC14E0APK
它们都是完全不同的产品。 master 始终是找到的最长字符串的 100% 匹配字符串。 对于产品abcde123,如果我的mastertable里面有abcde,那就是master。只有abc才是高手
您不需要花哨的如何关闭字符串函数,而是将字符串的开头与所有其他字符串进行比较,如果它们以相同的字符串。如果是这样,较短的是较长的 parent...
通过以下查询,您将获得 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
对于每一行,您只需使用 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