Поиск кратчайшего геопространственного расстояния в SQL

#sql #snowflake-cloud-data-platform #snowflake-schema

#sql #платформа облачных данных snowflake #snowflake-схема

Вопрос:

Я пытаюсь найти кратчайшее расстояние между местами и местоположением пользователя, и у меня есть две таблицы, а именно: Users_Location и Places

Таблица пользователя:

 |------------|------------|------------|
|   user_id  |  latitude  | longitude  |
|------------|------------|------------|
|    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  |
|------------|------------|------------|
 

Таблица мест

 |--------------|------------|------------|
|    Places    |  latitude  | longitude  |
|--------------|------------|------------|
|  New 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  |
|  Philadelphia|  38.91682  | -93.90692  |
|--------------|------------|------------|
 

Я хочу найти сокращенное расстояние между широтой-долготой пользователя и всеми другими местами.

Итоговая таблица будет выглядеть следующим образом:

 |------------|-----------------|
|   user_id  |  nearest_place  |
|------------|-----------------|
|    1       |    New York     |
|    2       |    Milwaukee    |
|    3       |    Chicago      |
|    4       |    New York     |
|    5       |    Philadelphia |
|------------|-----------------|
 

Я использую Snowflake в качестве хранилища данных и попытался использовать функцию HAVERSINE для вычисления геопространственного расстояния. Но я не понимаю, как мне перебирать каждое место в Places таблице, чтобы получить кратчайшее расстояние с помощью SQL

Ответ №1:

Это должно вывести ближайший город к пользователю:

 SELECT u.user_id, p.Places as nearest_place, 
    haversine( u.latitude, u.longitude, p.latitude, p.longitude) as distance
    FROM  users u, places p
    qualify row_number() over (partition by user_id order by distance) = 1;
 

Комментарии:

1. Можно ли использовать предложение Where в приведенном выше запросе?

2. Да, мы можем использовать предложение where перед предложением qualify и после предложения from