我们有包含公司名称和数字主键标识的表。我们正在清理数据,我们发现名称列中充满了代表同一家公司的相似名称。
例如 BA 和 Ba 或 GTC Ltd 和 GTC Limited。
无论如何使用 SQL 服务器,我们可以获得具有相似名称和 ID 列表的所有项目的计数和摘要。我想知道是否有某种相似性比较,我们可以为 etc 设置一个阈值
我们需要向客户提供一个看起来需要合并的名称列表。
我们有包含公司名称和数字主键标识的表。我们正在清理数据,我们发现名称列中充满了代表同一家公司的相似名称。
例如 BA 和 Ba 或 GTC Ltd 和 GTC Limited。
无论如何使用 SQL 服务器,我们可以获得具有相似名称和 ID 列表的所有项目的计数和摘要。我想知道是否有某种相似性比较,我们可以为 etc 设置一个阈值
我们需要向客户提供一个看起来需要合并的名称列表。
基本答案是“不”。正名是个难题。像“GTC Ltd”和“GTC Limited”这样的两个名称比“GTC”和“GTE”(通过更明显的衡量标准)更加不同。为此目的,有外部服务局和专用软件。
如果您正在处理少量数据,我建议您将值按字母顺序排列,将它们加载到 Excel 中,然后在 Excel 中添加一个带有“官方”名称的列。然后,您可以将其重新导入为数据库中的表以执行您想要的操作。如果您删除已知的后缀和前缀,例如“ltd”、“bros”、“partners”等,它可能会有所帮助。
如果您确实尝试走类似的道路soundex()
,那么请确保您很好地理解它。例如,soundex()
以下两个字符串的值是相同的:“gte, blah blah blah”和“gdteey, junk goes here”。
您的答案在于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 之间的值,其中数字越大表示匹配越好。
有很多功能可以检查相似之处。MS SQL 提供了我从未实际使用过的功能SOUNDEX
。DIFFERENCE
虽然我曾经在 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 距离。
您可以使用COLLATE UTF8_GENERAL_CI
andLIKE
运算符来检查 BA and Ba
. 但是GTC Ltd and GTC Limited
你仍然可以使用相同的,但是你应该手动检查它们并仔细合并。