我想根据 X、Y(长、纬度)坐标连接两个雪花表。
两个表中的每一行都是一个点,我想将表 A 中的每一行连接到表 B 中的最近点。
在Python中,GeoPandas模块有这个,它正是我需要的:geopandas.GeoDataFrame.sjoin_nearest
有没有办法在 Snowflake SQL 中做到这一点?在这种特殊情况下,我有(纬度,经度)点,但该解决方案应该理想地适用于任何几何/地理。
请注意,这与连接一定距离内的点不同,根据此answer,有半正弦函数。
这可能不是最优化的解决方案,但它有效:
select a.id, b.id, a.p, b.p, st_distance(a.p, b.p) dist
from random_points a
join random_points b
on a.id != b.id
qualify row_number() over(partition by a.id, b.id order by dist desc) = 1
我们正在进行交叉连接,并使用
qualify
只获取表 b
上与表 a
上每个点最近的点。
设置:
create or replace table random_points as
SELECT row_number() over(order by 1) id
, ST_POINT(
(UNIFORM(-180::float, 180, RANDOM())),
(UNIFORM(-90::float, 90, RANDOM()))
) p
FROM TABLE(GENERATOR(ROWCOUNT => 500));