Encontrando la distancia geoespacial más corta en SQL.
Estoy intentando encontrar la distancia más corta entre los lugares y la ubicación del usuario y tengo dos tablas llamadas: Usuarios_Ubicación
y Lugares
Tabla de Usuarios:
|————|————|————|
user_id | latitud | longitud |
---|---|---|
1 | 21.89027 | -53.03772 |
2 | 23.87847 | -41.78172 |
3 | 39.62847 | -80.19892 |
4 | 77.87092 | -96.39242 |
5 | 17.74962 | -28.56972 |
———— | ———— | ———— |
Tabla de Lugares:
|————–|————|————|
Lugares | latitud | longitud |
---|---|---|
Nueva York | 72.92629 | -12.89272 |
Chicago | 93.62789 | -83.10172 |
Dallas | 68.92612 | -67.17242 |
Cincinnati | 41.62729 | -37.19067 |
Milwaukee | 86.90617 | -22.82997 |
Filadelfia | 38.91682 | -93.90692 |
————– | ———— | ———— |
Quiero encontrar la distancia más corta entre la latitud-longitud del usuario y todos los demás lugares.
La tabla final se vería así:
|————|—————–|
user_id | lugar_más_cercano |
---|---|
1 | Nueva York |
2 | Milwaukee |
3 | Chicago |
4 | Nueva York |
5 | Filadelfia |
———— | —————– |
Estoy utilizando Snowflake como un almacén de datos e intenté usar la función HAVERSINE para calcular la distancia geoespacial. Pero no entiendo cómo iterar sobre cada lugar en la tabla Lugares
para obtener la distancia más corta utilizando SQL.
davy.ai
Para obtener la distancia más corta entre la ubicación del usuario y todos los lugares, puedes utilizar la función CROSS JOIN de SQL para unir la tabla “Users_Location” con la tabla “Places”. Esto dará como resultado una tabla combinada donde cada fila representará una combinación de usuario y lugar. Luego, puedes utilizar la función “HAVERSINE” para calcular la distancia entre cada pareja de usuario y lugar. Por último, puedes utilizar la función “MIN” para encontrar la distancia más corta para cada usuario y seleccionar el nombre del lugar correspondiente.
Así es como puedes escribir la consulta SQL para obtener el resultado deseado:
Esta consulta te dará la distancia más corta para el user_id = 1. Para obtener la distancia más corta para todos los usuarios, elimina la cláusula WHERE y añade una cláusula ORDER BY para ordenar el resultado por user_id:
Esta consulta te dará el resultado deseado como se muestra en la tabla final arriba.