【问题标题】:Querying Dataset to get Distance using Latitude/Longitude Function使用纬度/经度函数查询数据集以获取距离
【发布时间】:2011-05-06 14:57:51
【问题描述】:

早上好,

我正在做一个工作项目,但我陷入了僵局。我要做的是获取一个记录列表(记录包含商店的邮政编码、纬度和经度)并将它们放入最近的市场。

我有一个函数可以比较 2 个邮政编码及其相关的经纬度并获取距离。该功能在一次输入 1 条记录时运行良好。

我想要做的是找出一种方法让函数一次通过给定记录 1 工作并给我距离。

我目前拥有的是:

声明@i int
从#unmatched2中选择@i = min(RowID)
声明@max int
从#unmatched2 中选择@max = max(RowID) 而@i 从#unmatched2 中选择邮政编码、经度、纬度,其中 RowID = @i

DECLARE @Lat1 float
DECLARE @Long1 float
DECLARE @Lat2 float
DECLARE @Long2 float

SELECT  @Lat1 = max(Latitude) from #unmatched2 
where   RowID = @i
SELECT  @Long1 = max(Longitude) from #unmatched2 
where   RowID = @i
SELECT  @Lat2 = max(Latitude) from ProgramManagement.dbo.zipcode_lookup 
where   ZIPCode = 92101
SELECT  @Long2 = max(Longitude) from ProgramManagement.dbo.zipcode_lookup 
where   ZIPCode = 92101
select ProgramManagement.dbo.CoordinateDistanceMiles(@Lat1, @Long1, @Lat2, @Long2)
set @i = @i + 1  end

@database 是我用来获取行数的临时表。例如,在这种情况下,我使用的是#unmatched。

示例记录是:

 Zipcode, latitude , longitude 
 92101 , 32.7152778, -117.1563889 

输出只是距离上的一个数字:

140.01 

因此临时表将有大约 1300 条记录,并且每行的输出将是一个数字。

目前,上述内容正在运行,并且正在遍历整个表格,但我的输出以单独的结果出现。第一个是:

Zipcode Longitude   Latitude
93510   -118.1824020000 34.4679410000

第二个是:

Distance
134.035921098023

我需要做的只是从 1 到结尾的结果列表,而不是我目前得到的结果。有什么建议?或者有没有办法得到结果:

Zipcode     Longitude       Latitude        Distance
93510       118.1824020000  34.4679410000   134.035921..

【问题讨论】:

  • 什么是@databases?它是否包含经度和纬度?您能否发布一些示例数据和查询的预期输出?
  • @database 是我用来获取行数的临时表。例如,在这种情况下,我使用的是#unmatched。示例记录是:邮政编码、纬度、经度 92101、32.7152778、-117.1563889 输出将只是距离中的单个数字:140.01 因此临时表将有约 1300 条记录,并且每行的输出将是单个数字。

标签: sql tsql sql-server-2008


【解决方案1】:

我认为您只是想找到从#unmatched2 表中的每条记录到zipcode_lookup 表中的单个记录的距离。对此的设置逻辑是一个简单的join,然后在select中进行距离计算。

SELECT u.RowID, u.Zipcode, u.Longitude, u.latitude,
    ProgramManagement.dbo.CoordinateDistanceMiles(u.Latitude, u.Longitude, z.Lat, z.Long) dist
FROM #unmatched2 u
  CROSS JOIN (
    SELECT max(Latitude) Lat, max(Longitude) Long
    FROM ProgramManagement.dbo.zipcode_lookup
    WHERE ZIPCode = 92101
  ) z

这是假设 RowID 是唯一标识符,如果不是,则对其进行简单组...(这实际上更接近您的循环所做的)

SELECT u.RowID, u.Zipcode,
    max(u.Longitude) Longitude, max(u.latitude) Latitude,
    ProgramManagement.dbo.CoordinateDistanceMiles(max(u.Latitude), max(u.Longitude), z.Lat, z.Long) dist
FROM #unmatched2 u
  CROSS JOIN (
    SELECT max(Latitude) Lat, max(Longitude) Long
    FROM ProgramManagement.dbo.zipcode_lookup
    WHERE ZIPCode = 92101
  ) z
GROUP BY u.RowID, u.Zipcode

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 2013-10-25
    相关资源
    最近更新 更多