【问题标题】:Grouping similar field data in MySQL在 MySQL 中对相似的字段数据进行分组
【发布时间】:2018-03-01 11:40:33
【问题描述】:

在 MySQL 中,我有一个表,它接受来自多个输入通道的公共数据,并且包含约 100,000 行。

其中一个字段存储员工职能经理的姓名。在组织中,大约有 100 名这样的职能经理。

我遇到的问题是,由于有多个输入渠道,不同的报告系统为这些经理使用了不同的名称格式。

例如,John Smith 可以存储为;

John Smith
Smith, John
Smith John

现在这有点像噩梦,因为我们希望将此职能经理字段用作报告机制,这意味着我们需要按各个职能经理进行排序或分组。

每个季度后数据都会成为遗留数据,因此我们很乐意清理和格式化职能经理字段。

问题是,有没有一种简单的方法来对这些经理进行分组,即使他们的名字采用不同的格式,我正在寻找一种不涉及我逐个通过每个职能经理的方式,并声明如下这个:

UPDATE tablename SET fm_name = "John Smith" where fm_name like "%John%" and fm_name like "Smith"; 

例如;以编程方式,我可以获取第一条记录,将名称分解为其名字和姓氏字符串,然后匹配相似的记录并更新它们。然后移动到下一条记录。在 MySQL 中是否可以做到这一点,或者我最好在上面的层中做到这一点。

任何建议将不胜感激。

【问题讨论】:

  • 不确定您的问题是什么。你问“有没有一种简单的方法可以做到这一点”,但它似乎没有提到任何具体问题。如果您需要按它们进行排序/分组,如果您的数据不一致,我认为您无法提取任何性能。
  • 问题的标题甚至与问题本身不匹配!
  • @Jeto 我已经更新了问题。
  • @cdaiga 我认为标题完美匹配,我希望按原样对数据进行分组,但我认为这是不可能的,所以我很乐意接受一个提供更简单方法的解决方案清理数据。比为每个经理手动完成。
  • 好的,我现在把问题搞清楚了@Glen

标签: mysql


【解决方案1】:

如果你能想出一个归一化函数name_normalize(string),在给定精确输入或Bush, George H. W.的情况下产生George H. W. Bush,那么你可以这样做

  GROUP BY name_normalize(name)

并获得您想要的东西,而无需处理表中的数据。

就是这样一个功能。它使用 MySQL 的字符串函数。 https://dev.mysql.com/doc/refman/5.7/en/string-functions.html

IF(LOCATE(',',@name1) = 0,                               --need to change?
   @name1,                                               -- no, return original
   LEFT(CONCAT_WS(' ',                                   -- yes, concatenate...
                  TRIM(SUBSTRING_INDEX(@name1, ',',-1)), --  after last ,
                  @name1),                               --  whole name
        LENGTH(                                         -- cut to original name length
                REPLACE(@name1,',',''))))               -- but without the comma

用您的列名替换@name。请注意,这对逗号后的空格数很敏感。

将此函数定义为存储函数是明智的。一方面,您可以更好地处理奇怪的情况。另一方面,写在查询中有点长。

【讨论】:

  • 感谢您的回答。您的回答与this 相结合使我成功了 90%。现在只是异常值。 :)
  • 是的。异常值。他们不是在斗争吗?
  • 谢天谢地,似乎并不多。我有格式约翰史密斯,史密斯约翰和史密斯,约翰完成。出于某种原因,有几个史密斯,约翰没有空间漂浮。如果数据输入来自,我已将问题重新交给团队。他们真的应该都使用相同的格式。再次感谢。
猜你喜欢
  • 2022-01-13
  • 2018-03-15
  • 2017-07-01
  • 2012-01-27
  • 2016-01-13
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多