0

我们有包含公司名称和数字主键标识的表。我们正在清理数据,我们发现名称列中充满了代表同一家公司的相似名称。

例如 BA 和 Ba 或 GTC Ltd 和 GTC Limited。

无论如何使用 SQL 服务器,我们可以获得具有相似名称和 ID 列表的所有项目的计数和摘要。我想知道是否有某种相似性比较,我们可以为 etc 设置一个阈值

我们需要向客户提供一个看起来需要合并的名称列表。

4

4 回答 4

1

基本答案是“不”。正名是个难题。像“GTC Ltd”和“GTC Limited”这样的两个名称比“GTC”和“GTE”(通过更明显的衡量标准)更加不同。为此目的,有外部服务局和专用软件。

如果您正在处理少量数据,我建议您将值按字母顺序排列,将它们加载到 Excel 中,然后在 Excel 中添加一个带有“官方”名称的列。然后,您可以将其重新导入为数据库中的表以执行您想要的操作。如果您删除已知的后缀和前缀,例如“ltd”、“bros”、“partners”等,它可能会有所帮助。

如果您确实尝试走类似的道路soundex(),那么请确保您很好地理解它。例如,soundex()以下两个字符串的值是相同的:“gte, blah blah blah”和“gdteey, junk goes here”。

于 2013-09-16T11:06:09.127 回答
1

您的答案在于SoundEx()andDifference()函数。

DECLARE @a varchar(50) = 'BA'
      , @b varchar(50) = 'Ba'
;

SELECT @a
     , @b
     , SoundEx(@a)
     , SoundEx(@b)
     , Difference(@a, @b)
;

SET @a = 'GTC Ltd';
SET @b = 'GTC Limited';

SELECT @a
     , @b
     , SoundEx(@a)
     , SoundEx(@b)
     , Difference(@a, @b)
;

SET @a = 'BLAH';

SELECT @a
     , @b
     , SoundEx(@a)
     , SoundEx(@b)
     , Difference(@a, @b)
;

SoundEx就像“听起来像” - 它是一个返回输入表示的函数,您可以将其与其他输出进行比较。

Difference()函数返回一个介于 0 和 4 之间的值,其中数字越大表示匹配越好。

于 2013-09-16T10:31:15.840 回答
1

有很多功能可以检查相似之处。MS SQL 提供了我从未实际使用过的功能SOUNDEXDIFFERENCE

虽然我曾经在 PHP 中使用过Levenshtein(将 string1 转换为 string2 的最小编辑),但它非常有效。这是Devio 在 TSQL 中的实现,您可以将其作为一个函数放入您的代码中:

SELECT 
    LEVENSHTEIN(COL1, COL2) 
FROM 
    ExampleTable

WHERE条件:

SELECT 
    COL1, COL2
FROM
    ExampleTable
WHERE
    LEVENSHTEIN(COL1, COL2) < 5

在这里,我建议您实现一些CASE - WHEN - THEN逻辑,以找到适合您需要的正确 levenshtein 距离。

于 2013-09-16T10:31:20.133 回答
0

您可以使用COLLATE UTF8_GENERAL_CIandLIKE运算符来检查 BA and Ba. 但是GTC Ltd and GTC Limited你仍然可以使用相同的,但是你应该手动检查它们并仔细合并。

于 2013-09-16T10:25:10.613 回答