我想加入2个不同但相似的数据集。两者都确定地理位置。第一个是我自己的“精心挑选且完全没有错误的确定性列表”,而另一个则是来自各种未知来源的清单,包含多个“重复项”(明显和不明显)。
我的表的结构如下
CREATE TABLE [dbo].[Places] (
[place_id] [int] NOT NULL ,
[place_name] [varchar] (40),
[country_id] [varchar] (2),
[latitude] [decimal](8, 6) NULL ,
[longitude] [decimal](9, 6) NULL ,
[other_place_id] [int] NULL
)
第二张表的结构类似
CREATE TABLE [dbo].[OtherPlaces] (
[other_place_id] [int] NOT NULL ,
[other_place_name] [varchar] (40),
[country_id] [varchar] (2),
[latitude] [float] NULL ,
[longitude] [float] NULL ,
[place_id] [int] NULL
)
我可以运行简单的匹配查询
Select p.*, o.other_place_id
from Places p
JOIN OtherPlaces o
on p.country_id = o.country_id
and p.place_name = o.other_place_name
where abs(60*(p.latitude - o.latitude)) < 5
and abs(60*(p.longitude - o.longitude)) < 5
,这将匹配相距约5-10英里的几乎相同的地方。
这将匹配大约75%的记录。
剩余的一堆有很多问题:
假设我对第一个查询中的匹配的准确性感到满意,那么我只需运行等效的UPDATE查询 更新地点 SET other_place_id = o.other_place_id 来自Places p 加入其他地方 在p.country_id = o.country_id 和p.place_name = o.other_place_name 其中abs(60 *(p.latitude-o.latitude))<5 和abs(60 *(p。经度-o。经度))<5
这将允许使用(伪)代码进行进一步查询,例如
选择p。,o.other_place_id
来自Places p
加入其他地方
在p.country_id = o.country_id
和p.place_name SOUNDSLIKE(o.other_place_name)
其中abs(60 (p.latitude-o.latitude)) THat将允许我构建一个SOUNDSLIKE函数,该函数可以将Palmeira Bay与Baíade Palmeira相匹配,并将Sint Martaan与St. Martin相匹配。 “备用拼写”方案具有3个方面: 1和3可以相关,但通常不相关。 WRT位置信息,两个数据集之间通常会有细微的差异,这是可以接受的。但是,可能会遇到较大的差异。其中一些是有效的(即新加坡的经/纬度是多少?这是一个大岛),一些是数据输入中的转录/移位错误。在某些情况下,没有位置数据:-( 我的问题是,与一系列迭代查询,不断完善和排除先前的匹配项相比,是否有更好的方法来管理匹配过程? 以及如何最好地管理SOUNDSLIKE功能?我看过this thread并添加了Levenshtein和Metaphone功能,但是我不确定它们中的任何一个都对单个单词使用任何类似于词库的匹配。我认为同义词库/词典在这里可能是一个有用的工具,因为我已经确定了这两个数据集中重复的字数,并且肯定有等效词/术语的列表以创建查找。 最后,这样做的关键原因是我知道这种情况将来会一次又一次地发生,并且随着我们的前进,拥有更好的工具将很有用。 TIA