仅使用Oracle Views查找最近的位置

时间:2014-04-17 03:09:08

标签: sql oracle location latitude-longitude

我有一个用例,我需要使用当前的纬度和经度查找最近的员工。我正在使用的集成只允许我从Oracle表或视图中进行选择。我不能使用程序。

员工表格列

EmpID, Name, Address, City, State, Zip, Latitude, Longitude

变量LAT和LNG将为我提供当前位置。

我的想法是使用类似于以下内容的东西:

SELECT Name,
       Address
FROM Employee
WHERE EmpID IN
    (SELECT EmpID
     FROM Employee
     WHERE Latitude BETWEEN LAT - .25 AND LAT + .25
       AND Longitude BETWEEN LNG - .25 AND LNG + .25)

问题是它目前只会显示+/- .25的值,我也希望将结果排序以显示最近的员工。

非常感谢任何建议!

3 个答案:

答案 0 :(得分:0)

您是否在Oracle中使用空间,然后是空间查询:

SDO_NN使用空间索引来标识几何的最近邻居。

例如:

   SELECT *
   FROM   your_table r
   WHERE  SDO_NN(r.geometry_column, querying_geometry,  
                 'sdo_num_res=1 distance=50 unit=meter') = 'TRUE';

Documentation

中了解详情

答案 1 :(得分:0)

如果没有Oracle Spatial,您必须使用毕达哥拉斯:

select Name, Address, Latitude, Longitude,
   SQRT(POWER(Latitude-Lat, 2) + POWER(Longitude-Lng, 2)) as distance
from Employee
order by distance

我知道,因为你有Lat / Lon而不是笛卡尔坐标数学。结果不是100%精确,但它应该满足您的要求。

编辑: 为了得到最近的员工,你可以使用这个:

with t as 
   (select Name, Address, Latitude, Longitude,
      SQRT(POWER(Latitude-Lat, 2) + POWER(Longitude-Lng, 2)) as distance,
      RANK() OVER (PARTITION BY Name, Address ORDER BY SQRT(POWER(Latitude-Lat, 2) + POWER(Longitude-Lng, 2))) as dist_rank
   from Employee)
select *
from t
where dist_rank = 1

答案 2 :(得分:0)

从员工中选择功率(LAT - 纬度,2)+功率(LAT -Longitude,2)=(选择最小值(功率(LAT - 纬度,2)+功率(LAT - 长度,2))

可以吗?