【问题标题】:I need help returning subtle differences in two text columns from two tables我需要帮助从两个表中返回两个文本列中的细微差异
【发布时间】:2017-09-07 16:39:07
【问题描述】:

我当前的 SQL 查询是:

Select 
A.CFCIF#, B.CIFNO, B.SNAME, A.CFSNME
From dbo.tbl_CIF_Master A
Left Join dbo.tbl_Loan_Master B
On A.CFCIF# = B.CIFNO
Where 
B.[STATUS] not in (2,8) 
--and CONTAINS (A.CFSNME or FORMSOF (THESAURUS, B.SNAME)) --doesn't work. 
  I'm not an admin so I can't design thesaurus mappings
and B.SNAME LIKE '%' + A.CFSNME + '%'  -- works but no results which can't 
  be accurate

这运行良好,但没有发现任何差异,正如我使用 LIKE 所指出的那样。正如我所指出的那样,使用 THESAURUS 的行被注释掉了……我在两个“名称”字段 SNAME 和 CFSNME 中发现的细微差异的一个例子是细微的差异,例如在 LLC 或 Robert 缩写为 Rob 之前缺少逗号。

【问题讨论】:

  • 感谢您的洞察力。我正在使用 Microsoft SQL Server 2012 R2
  • 您认为您的一列比另一列更正确吗?
  • 任一列在任何情况下都可能不正确,因此我必须识别并记录所有差异。我只有 Management Studio/SQL,没有能力创建函数来开发“答案”。看起来很“糟糕”,因为似乎有多个“编程”解决方案。
  • 没有我能想到的直接通用的方法来执行此操作。解决方案的复杂程度取决于您的数据。例如,Richard 或 Margaret 是否会缩写为 Dick 或 Peggy? LTD和Limited怎么样?我会考虑首先拉出一组不同的SNAMECFSNME,左加入SNAME 的85% 位于CFSNME 中,反之亦然(其中超过5 个字符)。查看匹配并迭代地构建逻辑以实现更稳健的匹配,但这假设您的数据有很多很多事情。您的数据有多大?
  • 每列只有大约 13,000 行。到目前为止,我的抽样证明差异会更加微妙,这可能会使这变得困难。在像 Parsons, Micah M vs Parsons, Micah M. Ditto 这样的中间首字母之后没有句号,对于商业客户来说 - 可能在“LLC”之前缺少逗号,比如 ABC Materials LLC,它也可以在另一列中显示为 ABC Materials, LLC。跨度>

标签: sql sql-server tsql sql-like


【解决方案1】:

鉴于您正在寻找的差异的不确定性(您已实现的严格子字符串匹配不会捕获),您可以考虑计算列之间的相似性度量,然后确定该相似性的适当临界值度量来识别相同但有细微差别的字符串。请参阅 A better similarity ranking algorithm for variable length strings 了解您可能想要使用的相似度指标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2023-04-09
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多