【发布时间】: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_id 和branch_code 分组,并找到最小 距离,这可行吗?目前无权访问数据。
【问题讨论】:
-
你能分享你在这个问题上的最新编码尝试吗?
-
那么你在纠结哪一块?
-
我更新了我的帖子。我正在努力解决的问题是如何链接两个表,然后为每个客户计算他们的登录记录和每个分支之间的距离。