我有两张桌子,房子和商店。两者都有纬度和经度字段。我需要创建一个视图,它将返回Houses HouseId和StoreId中的每条记录,其中StoreId是最靠近房屋的商店的ID。我有一个函数CalculateDistance(float Long1,float Lat1,float Long2,float Lat2)。 但我无法想出能够提供我需要的视图的查询。
感谢。
答案 0 :(得分:1)
您可以在表中创建Error fn is not a function...
行(地理编码),并从Geography
和Latitude
填充它:
Longitude
然后从坐标查询最近的位置:
UPDATE [dbo].[MyTable]
SET [Geocode] = geography::Point(Latitude, Longitude , 4326)
GO
它将返回您的coordiantes中最接近的人。
答案 1 :(得分:0)
工作示例来自我的一个应用程序......您需要显式重新映射列和表。
DECLARE @Lat float= -83.555
DECLARE @Long float = 43.555
SELECT TOP 100 ID, Abbr, Distance FROM
(
SELECT NL.NodeLocationID AS ID, NL.NodeLocationAbbr AS Abbr, (ABS(NL.Latitude - @Lat) + ABS(NL.Longitude - @Long)) / 2 AS Distance
FROM NodeLocations AS NL
WHERE (NL.Latitude IS NOT NULL) AND (NL.Longitude IS NOT NULL)
) AS D1
ORDER BY Distance
以下查找相对于同一表中其他项的最近项(可以通过将NL2更改为另一个表来更改)。这可以找到最接近的项目,但是根据您处理的记录数量,性能很可怕。我建议你创建一个静态字段,并通过后台进程计算每个字段。
SELECT *
FROM
(
SELECT TOP 100 PERCENT *
, ROW_NUMBER () OVER (PARTITION BY ID ORDER BY Distance ASC) AS Rnk
FROM
(
SELECT NL.NodeLocationID AS ID, NL.NodeLocationAbbr AS Abbr
, NL2.NodeLocationID AS ID2, NL2.NodeLocationAbbr AS Abbr2
, (ABS(NL.Latitude - NL2.Latitude) + ABS(NL.Longitude - NL2.Longitude)) / 2 AS Distance
FROM NodeLocations AS NL
JOIN NodeLocations AS NL2 ON NL.NodeLocationID<>NL2.NodeLocationID AND (ABS(NL.Latitude - NL2.Latitude) + ABS(NL.Longitude - NL2.Longitude)) / 2 <= 0.1
WHERE (NL.Latitude IS NOT NULL) AND (NL.Longitude IS NOT NULL)
AND (NL2.Latitude IS NOT NULL) AND (NL2.Longitude IS NOT NULL)
) AS D1
) AS D2
WHERE D2.Rnk=1