2016-09-28 91 views
0

SQL距離計算這可能是一個克隆問題,但我搜索的其他答案沒有任何意義。我仍然在學習SQL,所以如果你能指導我完成這個過程,我將不勝感激。提前致謝。1點和其他任何其他

所以問題是:我有這個表格(其中有更多的數據),我需要得到最遠離菲烏米奇諾機場的機場名稱(這意味着我只有1組經度和緯度數據),我必須用距離函數來做。 Sql table

+0

? – anakic

+0

你能告訴我們你已經嘗試了什麼,並解釋它爲什麼沒有解決你的問題? – dfundako

+0

我刪除了不兼容的數據庫標籤。爲您正在使用的數據庫添加一個。 –

回答

0

無論距離函數使用的是(用於短距離在數千裏簡單的直線畢達哥拉斯,或者大圓公式任何東西),

Select * from table 
where [DistanceFunction] 
     (Latitude, Longitude, FiumicinoLatitude, FiumicinoLongitude) = 
    (Select Max([DistanceFunction] 
     (Latitude, Longitude, FiumicinoLatitude, FiumicinoLongitude)) 
     From table) 

,如果你需要找到機場最遠從(並不總是菲烏米奇諾)的一些任意的機場,那麼,假設@code是任意機場機場代碼:

Select * from table t 
    join table r on r.code = @code 
where [DistanceFunction] 
     (t.Latitude, t.Longitude, r.Latitude, r.Longitude) = 
    (Select Max([DistanceFunction] 
     (Latitude, Longitude, r.Latitude, r.Longitude)) 
3

只要你可以下面的SQL查詢運行

SELECT *, (3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) AS distance FROM table_name;

其中;

要按公里而非英里搜索距離,與6371.

取代3959是你的輸入緯度

-122是你輸入的經度

LAT是表其中包含機場緯度列名值

LNG是包含機場經度值表的列名

更多細節回答:Creating a store locator

0

SQL SERVER

,如果你正在努力尋找從每個機場最遠的一個,您將需要一個函數。但既然你說FCO,我就是爲FCO做的。

您正在使用哪種類型的數據庫
--temp table for testing 

select 'FCO' as code, 'Fiumicino' as name, 'Rome' as city, 'Italy' as country, 41.7851 as latitude, 12.8903 as longitude into #airports 
union all 
select 'VCE', 'Marco Polo','Venice','Italy',45.5048,12.3396 
union all 
select 'NAP', 'capodichino','Naples','Italy',40.8830,14.2866 
union all 
select 'CDG', 'Charles de Gaulle','Paris','France',49.0097,2.5479 

--create a point from your LAT/LON 
with cte as(
select 
    *, 
    geography::Point(latitude,longitude,4326) as Point --WGS 84 datum 
from #airports), 

--Get the distance from your airport of interest and all others. 
cteDistance as(
select 
    *, 
    Point.STDistance((select Point from cte where code = 'FCO')) as MetersToFiuminico 
from cte) 

--this is the one that's furthest away. Remove the inner join to see them all 
select d.* 
from 
    cteDistance d 
    inner join(select max(MetersToFiuminico) as m from cteDistance where MetersToFiuminico > 0) d2 on d.MetersToFiuminico = d2.m