es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    SELECT ul.user_id, p.Places AS nearest_place
    FROM Users_Location ul
    CROSS JOIN Places p
    WHERE ul.user_id = 1
    GROUP BY ul.user_id
    HAVING min(HAVERSINE(ul.latitude, ul.longitude, p.latitude, p.longitude)) = 
        HAVERSINE(ul.latitude, ul.longitude, p.latitude, p.longitude)
    

    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:

    SELECT ul.user_id, p.Places AS nearest_place
    FROM Users_Location ul
    CROSS JOIN Places p
    GROUP BY ul.user_id
    HAVING min(HAVERSINE(ul.latitude, ul.longitude, p.latitude, p.longitude)) = 
        HAVERSINE(ul.latitude, ul.longitude, p.latitude, p.longitude)
    ORDER BY ul.user_id
    

    Esta consulta te dará el resultado deseado como se muestra en la tabla final arriba.

Comments are closed.