计算城镇距离,不包括 SQL 中的时间地点
Calculating town distance excluding the locations with time in SQL
我有两张桌子
位置: 有城镇名称、位置 latitude/longitude 和城镇开放日期
|--------------|------------|------------|-------------------|
| Towns | latitude | longitude | establish_time |
|--------------|------------|------------|-------------------|
| Town_A | 72.92629 | -12.89272 | 2021-07-21 |
| Town_B | 93.62789 | -83.10172 | 2021-08-21 |
| Town_C | 68.92612 | -67.17242 | 2021-09-21 |
|--------------|------------|------------|-------------------|
用户:有user_id,用户latitude/longitude,购买电影票的城镇,购买时间
|------------|------------|------------|--------------|-----------------|
| user_id | latitude | longitude | Towns | purchase_time |
|------------|------------|------------|--------------|-----------------|
| 1 | 21.89027 | -53.03772 | Town_A | 2021-08-19 |
| 1 | 23.87847 | -41.78172 | Town_C | 2021-09-29 |
| 1 | 77.87092 | -96.39242 | Town_A | 2021-11-07 |
| 2 | 83.37847 | -62.78278 | Town_B | 2021-10-21 |
| 3 | 89.81924 | -80.73892 | Town_B | 2021-12-07 |
| 3 | 27.87282 | -18.39183 | Town_A | 2021-08-23 |
|------------|------------|------------|--------------|-----------------|
我试图找到购票时从用户位置到所有其他城镇的最短距离 purchase_time
这是我的SQL(雪花):
SELECT
u.*,
seq4() as seq,
l.town as nearest_town,
haversine(u.latitude, u.longitude, l.latitude, l.longitude)
FROM User AS u, location AS l
QUALIFY row_number() OVER (PARTION BY u.seq ORDER BY haversine(u.latitude, u.longitude, l.latitude, l.longitude)) = 1
我得到的结果实际上是基于用户位置如下:
|------------|------------|------------|--------------|-----------------|
| user_id | latitude | longitude | Towns | nearest_town |
|------------|------------|------------|--------------|-----------------|
| 1 | 21.89027 | -53.03772 | Town_C | Town_C |
| 1 | 23.87847 | -41.78172 | Town_C | Town_A |
| 1 | 77.87092 | -96.39242 | Town_A | Town_B | <--- This should be Town_A because Town_B was not present at the time of purchase
| 2 | 83.37847 | -62.78278 | Town_B | Town_C |
| 3 | 89.81924 | -80.73892 | Town_B | Town_A |
| 3 | 27.87282 | -18.39183 | Town_A | Town_C | <--- This should be Town_A because Town_B was not present at the time of purchase
|------------|------------|------------|--------------|-----------------|
即使 purchase_time
时城镇不存在,上述查询也会导致 nearest_town
如何在计算nearest_towns
时排除未开放的城镇
将隐式 CROSS JOIN
(由 FROM 子句中的逗号分隔表列表暗示)切换为 INNER JOIN
,其中 ON
条件是您要添加的日期限制.
类似
FROM Users AS u
INNER JOIN location AS l
ON l.establish_time <= u.purchase_time
这用英文说“加入这两张桌子时,只考虑购买这张票之前建立的位置”。
我有两张桌子
位置: 有城镇名称、位置 latitude/longitude 和城镇开放日期
|--------------|------------|------------|-------------------|
| Towns | latitude | longitude | establish_time |
|--------------|------------|------------|-------------------|
| Town_A | 72.92629 | -12.89272 | 2021-07-21 |
| Town_B | 93.62789 | -83.10172 | 2021-08-21 |
| Town_C | 68.92612 | -67.17242 | 2021-09-21 |
|--------------|------------|------------|-------------------|
用户:有user_id,用户latitude/longitude,购买电影票的城镇,购买时间
|------------|------------|------------|--------------|-----------------|
| user_id | latitude | longitude | Towns | purchase_time |
|------------|------------|------------|--------------|-----------------|
| 1 | 21.89027 | -53.03772 | Town_A | 2021-08-19 |
| 1 | 23.87847 | -41.78172 | Town_C | 2021-09-29 |
| 1 | 77.87092 | -96.39242 | Town_A | 2021-11-07 |
| 2 | 83.37847 | -62.78278 | Town_B | 2021-10-21 |
| 3 | 89.81924 | -80.73892 | Town_B | 2021-12-07 |
| 3 | 27.87282 | -18.39183 | Town_A | 2021-08-23 |
|------------|------------|------------|--------------|-----------------|
我试图找到购票时从用户位置到所有其他城镇的最短距离 purchase_time
这是我的SQL(雪花):
SELECT
u.*,
seq4() as seq,
l.town as nearest_town,
haversine(u.latitude, u.longitude, l.latitude, l.longitude)
FROM User AS u, location AS l
QUALIFY row_number() OVER (PARTION BY u.seq ORDER BY haversine(u.latitude, u.longitude, l.latitude, l.longitude)) = 1
我得到的结果实际上是基于用户位置如下:
|------------|------------|------------|--------------|-----------------|
| user_id | latitude | longitude | Towns | nearest_town |
|------------|------------|------------|--------------|-----------------|
| 1 | 21.89027 | -53.03772 | Town_C | Town_C |
| 1 | 23.87847 | -41.78172 | Town_C | Town_A |
| 1 | 77.87092 | -96.39242 | Town_A | Town_B | <--- This should be Town_A because Town_B was not present at the time of purchase
| 2 | 83.37847 | -62.78278 | Town_B | Town_C |
| 3 | 89.81924 | -80.73892 | Town_B | Town_A |
| 3 | 27.87282 | -18.39183 | Town_A | Town_C | <--- This should be Town_A because Town_B was not present at the time of purchase
|------------|------------|------------|--------------|-----------------|
即使 purchase_time
时城镇不存在,上述查询也会导致 nearest_town如何在计算nearest_towns
时排除未开放的城镇将隐式 CROSS JOIN
(由 FROM 子句中的逗号分隔表列表暗示)切换为 INNER JOIN
,其中 ON
条件是您要添加的日期限制.
类似
FROM Users AS u
INNER JOIN location AS l
ON l.establish_time <= u.purchase_time
这用英文说“加入这两张桌子时,只考虑购买这张票之前建立的位置”。