[英]SQL Server: how to find closest location?
我有兩個桌子,房屋和商店。 兩者都有緯度和經度字段。 我需要創建一個視圖,該視圖將針對Houses HouseId和StoreId中的每條記錄返回,其中StoreId是離房子最近的商店的ID。 我確實有一個函數CalculateDistance(float Long1,float Lat1,float Long2,float Lat2)。 但是我無法提出可以構成我所需視圖的查詢。
謝謝。
您可以在表格中創建Geography
行(地理編碼),然后從Latitude
和Longitude
填充它:
UPDATE [dbo].[MyTable]
SET [Geocode] = geography::Point(Latitude, Longitude , 4326)
GO
然后從坐標查詢最近的位置:
DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(1) Geocode.STDistance(@g), ShopId FROM MyTable
ORDER BY Geocode.STDistance(@g);
它將返回您的coordiantes的最接近者。
在我的一個應用程序中的工作示例...您顯然需要重新映射列和表。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.