簡體   English   中英

SQL Server:如何查找最近的位置?

[英]SQL Server: how to find closest location?

我有兩個桌子,房屋和商店。 兩者都有緯度和經度字段。 我需要創建一個視圖,該視圖將針對Houses HouseId和StoreId中的每條記錄返回,其中StoreId是離房子最近的商店的ID。 我確實有一個函數CalculateDistance(float Long1,float Lat1,float Long2,float Lat2)。 但是我無法提出可以構成我所需視圖的查詢。

謝謝。

您可以在表格中創建Geography行(地理編碼),然后從LatitudeLongitude填充它:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM