计算每个商店位置sql查询的最小距离

Posted

技术标签:

【中文标题】计算每个商店位置sql查询的最小距离【英文标题】:calculate min distance of each shop's location sql query 【发布时间】:2020-02-12 05:03:09 【问题描述】:

我有一个表格,其中包含每个商店的 X、Y 坐标。我想找到彼此的最小距离。我的意思是最近的商店。

例如:(期望的输出)

Shop_ID      Nearest_Shop_ID 
Shop_1       Shop_5
Shop_2       Shop_8
Shop_3       Shop_4


Select SHOP_ID, Longtitude, Latitude From PARTNER_ADDRESSES
group by SHOP_ID, Longtitude, Latitude;

这是我的店铺坐标表;

SHOP_ID     LONGTITUDE  LATITUDE
38599       32.815282   39.882793
38613       25.965545   42.166315
38682       31.845157   37.419859
38686       34.027568   38.370871

我有一个公式可以计算两个位置之间的距离(使用纬度和经度)。这是公式;

(NVL(6387.7,0) * ACOS((sin(NVL(Latitude1,0) / 57.29577951) * SIN(NVL(Latitude2,0) / 57.29577951)) +
        (COS(NVL(Latitude1,0) / 57.29577951) * COS(NVL(Latitude2,0) / 57.29577951) *
         COS(NVL(Longtitude2,0) / 57.29577951 - NVL(Longtitude1,0)/ 57.29577951))))

Latitude1  : Shop 1's Latitude value
Longtitude1: Shop 1's Longtitude value

Latitude2  : Shop 2's Latitude value
Longtitude2: Shop 2's Longtitude value

是否可以编写这种sql来计算每个商店的距离并列出每个商店的最小距离值?

【问题讨论】:

你的桌子有多大?性能有多重要? 我的桌子上有 5000 家商店。性能对我们很重要。谢谢@GordonLinoff 【参考方案1】:

你可以使用交叉连接来做每家商店和每家商店,比如

select <distance formula> from shops as ashops cross join shops as bshops

从那里,您可以使用嵌套 SQL 从每个商店的最小距离中选择一个

【讨论】:

【参考方案2】:

我认为你可以使用cross join,然后使用row_number

with distance1 as (
select
pa1.SHOP_ID as shop_id1, pa1.Longtitude longitude_1, pa1.Latitude latitude_1,
pa2.SHOP_ID as shop_id2, pa2.Longtitude longitude_2, pa2.Latitude latitude_2,
<your_distance_formula> as Distance
from PARTNER_ADDRESSES pa1
cross join PARTNER_ADDRESSES pa2
where pa1.SHOP_ID <> pa2.SHOP_ID -- remove record where shops are the same
)

select *
from (
select *,
row_number() over (partition by shop_id1 order by Distance) rn_distance
from distance1
) 
where rn_distance = 1

【讨论】:

【参考方案3】:

您可以使用self joinanalytical function

Select s1, s2 from
(Select a1.shop_id as s1, a2.shop_id as s2,
Row_number() 
over (partition by a1.shop_id
  Order by <your_formula>) as rn
From partner_adresses a1
Join partner_adresses a2
On (a1.shop_id <> a2.shop_id))
Where rn = 1;

干杯!!

【讨论】:

以上是关于计算每个商店位置sql查询的最小距离的主要内容,如果未能解决你的问题,请参考以下文章

翻译SQL最近位置查询语句(MySQLPostgreSQLSQL Server)

SQL查询和计算;正确格式化查询以仅选择 id

使用 SQL 创建查询哪个网格位置在商店中产生最多收入

SqlServer数据库中,日期的模糊查询

如何通过经纬度计算距离来优化 SQL 查询?

在sql查询中计算距离(毕达哥拉斯)和运行计数