【问题标题】:Find Nearest Location using Oracle Views only仅使用 Oracle 视图查找最近的位置
【发布时间】:2014-04-17 03:09:08
【问题描述】:

我有一个用例,我需要使用我当前的纬度和经度找到最近的员工。我使用的集成只允许我从 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,我还希望对结果进行排序以首先显示最近的员工。

任何建议将不胜感激!

【问题讨论】:

    标签: sql oracle location latitude-longitude


    【解决方案1】:

    select * from where power(LAT - Latitude,2)+power(LAT -Longitude,2) = (select min(power(LAT - Latitude,2)+power(LAT -Longitude,2)) from Employee)

    可以吗?

    【讨论】:

    • select * from Employee order by power(LAT - Latitude,2)+power(LAT -Longitude,2) asc;
    【解决方案2】:

    你是否在你的 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

    【讨论】:

    • 我不确定如何将 lat/long 传递给这个?
    【解决方案3】:

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

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

    我知道,因为您使用纬度/经度而不是笛卡尔坐标来计算数学。结果不是 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
    

    【讨论】:

    • 无论如何要将派生列:SQRT(POWER(Latitude-Lat, 2) + POWER(Longitude-Lng, 2)) 移动到 where 子句中?我需要直接从表或视图中选择,并且不能有派生列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多