我有一个大的垂直条分隔文件,其中包含大约128,000行,其中包含第1列中由公共号指定的多个作业代码,我还有另一个文件,其中包含2列,其中一列包含作业代码,另一列包含说明。
我想要做的是将每个工作代码分成自己的表,其中包括姓名,地址,邮政编码。填好表后,我需要确定不同作业代码之间的距离,并显示作业a中作业b的最近位置。
答案 0 :(得分:1)
我建议你仔细看看SQL Server Integration Services(SSIS)。
SSIS专为此类工作而设计 - 它允许您加载,解析,转换并最终将来自任何类型的数据的数据存储到SQL Server中。
您可以将其作为一次性导入运行,也可以存储该软件包以供以后重复使用,以便稍后导入其他文件。
答案 1 :(得分:0)
我将假设您正在使用具有空间数据支持的SQL 2008。
听起来你可能在同一个站点(即地址)有多个作业,所以我会创建一个作业表,其中一个外键指向一个包含所有地址信息列的站点表和一个附加列类型为Geography。
您需要设置一个流程,使用地理编码信息(即地址的纬度和经度)填充该地理类型列,MapPoint Batch Geocoder是使用MapPoint(现在Bing地图)服务的SSIS流程并且可能是开发自己的过程的良好起点。
一旦您能够获得地址的地理编码,就可以轻松更新SQL表。
UPDATE Sites
SET GeoLocation = GEOGRAPHY::POINT(@latitude, @longitude, 4326)
WHERE SiteID = @siteId
无论您在管道中的哪个位置集成Geocoder,我都建议您以这样的方式对其进行抽象,以便您可以轻松更改Geocode服务提供商或指定在运行时使用哪个服务提供商,因为这些服务都有不同的定价方案使用一个在另一个上可能证明在经济上是有益的。例如,Google每年提供912,500个免费请求,每天最多2,500次,没有会话限制,而Bing每年仅提供500,000个请求,每天没有限制,但限制为125,000个会话。因此,对于大批量请求,Bing赢了但是对于每个项目或随机请求,Google排在最前面。最后,这些服务的数据质量是可比较的,所以改变你的来源以避免费用是没有害处的。
导入数据并填充地理编码后,计算距离并找到最近邻居变得微不足道。
DECLARE @Sites TABLE ( SiteId INT )
--Get the site ids you care about
INSERT INTO @Sites
SELECT SiteId FROM Jobs WHERE Status = 'Open'
/*
* For each site in your table variable @Sites, this will list
* all the other sites in the variable in order of distance.
*/
SELECT p.SiteId
, s.SiteId
, p.GeoLocation.STDistance(s.SiteId) * 0.001 AS [Distance (Kilometers)] --https://www.google.com/search?q=meters+to+kilometers
, p.GeoLocation.STDistance(s.SiteId) * 0.000621371192 AS [Distance (Miles)] --https://www.google.com/search?q=meters+to+miles
FROM Sites AS [p]
JOIN Sites AS [s]
ON s.SiteId != p.SiteId
AND s.SiteId IN (SELECT SiteId FROM @Sites)
WHERE p.SiteId IN (SELECT SiteId FROM @Sites)
ORDER BY p.SiteId, s.SiteId, p.GeoLocation.STDistance(s.GeoLocation)