tsql - 针对自身检查 SQL Server 表值

标签 tsql levenshtein-distance

假设我有这张 table :

declare @tmpResults table ( intItemId int, strTitle nvarchar(100), intWeight float )

insert into @tmpResults values (1, 'Item One', 7)
insert into @tmpResults values (2, 'Item One v1', 6)
insert into @tmpResults values (3, 'Item Two', 6)
insert into @tmpResults values (4, 'Item Two v1', 7)

还有一个函数,我们称之为 fn_Lev,它接受两个字符串,将它们相互比较并返回它们之间的差异数作为整数(即​​ Levenshtein 距离)。

查询该表的最有效方法是什么,检查每个 strTitle 的 fn_Lev 值与表中所有其他 strTitles 的关系,并删除彼此相似且 Levenshtein 距离为 3 的行,而不是保持较高的 intWeights?

所以在删除之后,@tmpResults 应该包含

1   Item One    7
4   Item Two v1 7

我可以想办法做到这一点,但没有什么是非常慢的(即迭代)。我确定有更快的方法?

干杯, 马特

最佳答案

SELECT strvalue= CASE 
                WHEN t1.intweight >= t2.intweight THEN t1.strtitle 
                ELSE t2.strtitle 
              END, 
       dist = Fn_lev(t1.strtitle, t2.strtitle) 
FROM   @tmpResults AS t1 
       INNER JOIN @tmpResults AS t2 
         ON t1.intitemid < t2.intitemid 
WHERE  Fn_lev(t1.strtitle, t2.strtitle) = 3 

这将执行一个自连接,每行只匹配一次。它将排除匹配行本身或先前匹配的反向,即如果 A<->B 是匹配项,则 B<->A 不是。

case语句选择最高权重的结果

关于tsql - 针对自身检查 SQL Server 表值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12621927/

相关文章:

sql - SQL Server 中从字符串转换为 uniqueidentifier 错误时转换失败

regex - 将字符串转换为匹配正则表达式的最少编辑操作数

sql-server - 单词的 Damerau-Levenshtein 距离

php - mysqli 准备好的语句中的编辑距离

java - HTML 页面比较 - 编辑距离

sql - T-SQL 转换与转换

tsql - T-SQL : Salted Passwords

php - 拼写检查街道地址的最佳方法是什么?

sql - 我们应该用 GO 语句结束存储过程吗?

sql-server - 如何分离变量和值,然后插入表中?