我有一个用例,我需要使用当前的纬度和经度查找最近的员工。我正在使用的集成只允许我从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的值,我也希望将结果排序以显示最近的员工。
非常感谢任何建议!
答案 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';
中了解详情
答案 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))
可以吗?