这似乎应该是一个简单的解决方案,但由于某种原因,我无法解决这个问题。
我有一个表格,其中USER_FULL_NAME
为主键,右侧各种指标约有15列。我有一些情况,其中多个USER_FULL_NAME
拼写错误,但实际上应该总结到同一行。 IE浏览器。 " David Hands"可拼写为#34; Davide Handes"和" Bobby Orr"可拼写为" Boby Or。"表中共有大约150行,但大约有136行USER_FULL_NAME
。
如何编写SQL查询以将150行合并到唯一的136行中,其中应该组合的USER_FULL_NAME
实际上是组合的?
我已将另一列添加到名为TPS_User_names
的矩阵表中,一个用于USER_FULL_NAME
,另一个用于DUPLICATE_USER_FULL_NAME
。这是我提出的但似乎不起作用的查询:
select
tun.user_full_name,
sum(ad.processed_mss)
from all_data ad left join tps_user_names tun on ad.user_full_name = tun.user_full_name and ad.user_full_name = tun.duplicate_user_full_name
where ad.user_full_name = 'A' and ad.user_full_name = 'A1'
group by tun.user_full_name
答案 0 :(得分:2)
在实践中做到这一点并不是一个微不足道的问题,即使可能很容易捕捉到“相似”并因此假设相同的名字。
考虑一下 - 如果你要通过算法进行此操作,你会遇到许多边缘情况,你或者计算机需要拨打电话:Jon Smith与John Smith或Jon相同史密斯?也许。也许不是。
除非您有其他标识符,否则无法知道,这意味着您将很难从中获得有意义的聚合。进行模糊文本匹配的一种方法是计算Levenshtein距离,这是一种量化两个字符串彼此接近程度的方法,但由于上述原因,您可能仍会得到误报。
如果您的问题是反复发生的(如需要频繁更新),您可能需要重新考虑数据库结构并拥有一个不是实际名称的主键,并查看如何添加新条目到桌子。如果可能的话,这是评估您是否正在处理新用户名的理想时间。
对于一次性,我会查询有重复项的16行并单独评估。
答案 1 :(得分:1)
不是严格意义上的编码解决方案,但您可以创建一个矩阵表,其中包含两列,即重复的USER_FULL_NAME和实际的USER_FULL_NAME,LEFT JOIN到此表,并在您进行聚合时使用实际的USER_FULL_NAME。如果没有重新访问您的架构或更正表中的错误,这是最好的方式,imo。在它不断发生的情况下,您在矩阵表中添加一行而不是更改代码。 (还应该注意,您可以使用涉及矩阵表的临时步骤来重新规范您的原始表。除了关键关系问题,您可以创建矩阵,拉出聚合查询,然后使用它重新插入/更新您的原始表。)
编辑:由于您提供了代码,以下是您可以对将新表格整合到混音中所做的修改:
SELECT Nz(tun.user_full_name, ad.user_full_name) As user_full_name_agg,
SUM(ad.processed_mss)
FROM all_data ad LEFT JOIN tps_user_names tun
ON ad.user_full_name = tun.duplicate_user_full_name
GROUP BY Nz(tun.user_full_name, ad.user_full_name);
Nz将从tun.user_full_name或它找到的ad.user_full_name中选择第一个非空值。因此,对于欺骗,它将使用它在tun中找到的统一user_full_name,而对于其他人,则使用广告中的那个。