【问题标题】:Find closest branch based on distance between coordinates根据坐标之间的距离查找最近的分支
【发布时间】:2022-06-16 00:07:34
【问题描述】:

我在 Teradata 中有两个表。

表 1 - 登录:

Customer ID Latitude Longitude
A 44.5 66.41
B 12.3 62.21
C 12.3 42.21
A 22.3 52.21
C 92.3 2.21
A 44.5 66.41
A 44.5 66.41

表 2 - 位置:

Branch Code Latitude Longitude
1 4.5 16.41
2 33.3 22.21
3 52.3 42.21

两者之间没有关系。我想创建一个表,从表 1 和表 2 中的任何分支中查找客户之间的最近距离。表 1 中的数据只是登录的客户的地理位置,因此客户可以拥有多条记录。对于每个客户,我希望根据坐标之间的距离和 基于从该位置登录的次数,为每个客户提供离他们最近的分支 - 所以他们登录最多的位置,这就是我想跑到树枝上,找到离它最近的树枝。

所以新表将如下所示。客户 A(从同一位置登录 3 次)离分行 2 最近,等等。

Customer ID Closest To
A 2
B 2
C 3

我首先想到的是将纬度和经度转换为 ST_GEOMETRY (Point(lat, long)),然后找到距离,但我不确定如何链接两个表或进行客户的每种组合(或登录次数最多的客户的位置)和分支机构。对 Teradata 来说还是很陌生。

我尝试了什么:

SELECT customer_id, CAST('POINT(' || latitude || ', ' || longitude || ')' AS ST_GEOMETRY) AS loc1
FROM login

SELECT branch_code, CAST('POINT(' || latitude || ', ' || longitude || ')' AS ST_GEOMETRY) AS loc2
FROM location

我基本上想要loc1.ST_SphericalDistance(loc2),但我正在努力解决的是“加入”两个表并尝试所有组合。

编辑

我想我已经完成了最初的部分。此交叉连接两个表并找到每个客户(非唯一)的距离。

SELECT g.customer_id, l.branch_code, g.loc1.ST_SphericalDistance(l.loc2) AS distance
FROM (
    SELECT customer_id, CAST('POINT(' || latitude || ', ' || longitude || ')' AS ST_GEOMETRY) AS loc1
    FROM login) AS g
CROSS JOIN (
    SELECT branch_code, CAST('POINT(' || latitude || ', ' || longitude || ')' AS ST_GEOMETRY) AS loc2
    FROM location) AS l

如果我按customer_idbranch_code 分组,并找到最小 距离,这可行吗?目前无权访问数据。

【问题讨论】:

  • 你能分享你在这个问题上的最新编码尝试吗?
  • 那么你在纠结哪一块?
  • 我更新了我的帖子。我正在努力解决的问题是如何链接两个表,然后为每个客户计算他们的登录记录和每个分支之间的距离。

标签: sql teradata


猜你喜欢
  • 2016-10-31
  • 2017-06-21
  • 2018-02-06
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 2016-10-28
相关资源
最近更新 更多