6

我对 SQL 很陌生,如果这个问题听起来很奇怪,我很抱歉。

我不断遇到数据不佳的问题。例如,伦敦可以存储为 LON、London UK、London England 等。在使用 SQL 之前,我有很多 Excel 查找表,在第一列中我会有原始的,而在第二个帮助列中我会更正版本。举个例子:

Name             Name_1
London, UK       London
Lon              London
LON              London
London           London
London, England  London
LND              London

在 SQL 中是否有一种简单的方法来执行此操作?我目前正在尝试创建查找表,然后使用联接。这变得很棘手,因为我并不总是对每个实例都有更正,所以在大多数情况下,我的查找表的项目比我加入它们的表要少。

我一直在自学存储过程,我想知道这是否可以解决问题。麻烦是我对查找表主题的搜索是空的。

任何建议或指点都将不胜感激,即使只是说不能这样做。

一如既往地感谢您的帮助和对长篇文章的歉意。

4

4 回答 4

2

您可以加入查找表并最好使用那里给出的值。如果找不到,请使用原件:

SELECT t1.FirstName, LookupField = ISNULL(t2.Name_1, t1.LookupField)
FROM People as t1
LEFT INNER JOIN TableLookupCities as t2 ON t1.LookupField = t2.Name

确保对于每个名称,在 中最多有一个匹配TableLookupCities项,否则连接将产生多个结果。在 上创建唯一索引TableLookupCities.Name

CREATE UNIQUE (CLUSTERED) INDEX djgndkg ON TableLookupCities (Name) INCLUDE (Name_1)
于 2013-10-17T12:44:43.217 回答
1

您不必做任何其他事情,如果您没有翻译,只需返回原件即可。

SELECT
t1.FirstName,
t1.LookupField,
case when t2.Name_1 is null 
    then t1.lookupfield 
    else t2.name_1 end Name_1
FROM People as t1
LEFT INNER JOIN TableLookupCities as t2
ON t1.LookupField = t2.Name
于 2015-02-26T15:23:54.873 回答
0

底线......坏数据就是坏数据,使用坏数据或清理坏数据或两者兼而有之需要大量工作。

澄清后更新

构建您自己的 ETL(提取、转换、加载)流程来处理所有变体传入数据。您的 ETL 流程很可能会随着您收到的每批新数据而修改,因为您将不得不捕获新的“坏数据”变体。

将数据导入 ALL VARCHAR 表
运行 ETL 过程

  • 好的数据进入真实的数据表
  • 错误数据进入异常表

重复
修改 ETL 流程
运行 ETL 流程,
直到不再出现异常

-- 结束更新

如果您使用 LEFT JOIN,您可以相当容易地识别缺失值。

SELECT
t1.FirstName,
t1.LookupField,
t2.Name_1
FROM People as t1
LEFT INNER JOIN TableLookupCities as t2
ON t1.LookupField = t2.Name

任何地方 t2.Name_1 返回一个 NULL,您知道您需要将该“LookupField”添加到您的查找表中。这是一本学习数据库设计的好书Database Design for Mere Mortals

-- Group By to Find Missing Unique Values
t1.LookupField,
t2.Name_1
FROM People as t1
LEFT INNER JOIN TableLookupCities as t2
ON t1.LookupField = t2.Name
GROUP BY 
t1.LookupField,
t2.Name_1
于 2013-10-17T12:18:46.687 回答
0

如上所述,不良数据是它自己的问题。数据清洗本身就是一个行业,因此对于此类问题,您有多种选择,从简单明了,到精心尝试解决所有花里胡哨的问题。什么是“最好的”取决于您的情况和需求。

当然,可以继续扩展此查找表以适应越来越多的标准错误/变体,但如果这是持续的信息流,则会产生维护开销。这可能足以满足您的需求,因此不要仅仅因为有更好的选择而回避它。

用人工干预的可靠性换取自动化方法的可扩展性是很常见的;这更容易维护和发展,但是(取决于您的问题的性质)可能会出错。

例如 1. 使用基于模式的方法(Contains、LIKE、RegEx)来找到看起来很合适的东西。在某些情况下这可能很好,例如当 Name_1 是一个静态的、易于理解的列表时,因此您可以确保结果通常足够好。+ 易于设置/理解 + 比完整列表更灵活 - 仍然需要一些维护 - 在复杂/难以理解的情况下毫无希望

例如 2. 在更一般的情况下,您可以使用数据库提供的文本搜索功能来“评分”一个值与另一个值的匹配程度,并选择最佳匹配选项。同样,这在所有情况下都不是万无一失的或安全的,而且设置起来需要更多的工作,但它更健壮。这需要更多的性能密集型,因此所涉及的数据集的大小、您工作的时间尺度以及可用的基础设施也是考虑因素。+ 相当好的成功率 - 较慢的设置 - 更大的性能开销

例如 3. 另一种选择是更具体的领域。在这种情况下,它是空间数据,因此您可以使用 3rd 方地理编码服务作为验证手段。+ 高成功率 + 能够处理巨大范围的值, - 可能会产生额外的成本 - 最难/最慢的设置

于 2013-10-17T12:27:23.620 回答