2017-02-05 2 views
0

Я начинаю с SQL и задаю вопрос, который включает в себя выполнение запроса в Hive, который, по моему мнению, очень похож/аналогичен SQL-коду. Моя таблица данных выглядит следующим образом:SQL - найти расстояния между двумя городами, отформатировать таблицу

name  lat  long 
NY  40.3 70.3 
SF  36.1 60.2 
LA  36.5 53.1 
CH  45.2 62.3 
... 

мне нужно найти все города в пределах определенного расстояния друг от друга, причем расстояние измеряется по latitutde и долготы.

Моя текущая идея о том, как решить эту проблему следующим образом:

  1. Если есть п = 10 городов (таким образом, п = 10 строк в таблице), создать новую таблицу с (10 * 9)/2 = 45 строк, где каждая строка теперь имеет 6 столбцов (city1, city2, lat1, lat2, long1, long2)
  2. С строками в этом формате я могу просто использовать вычисления типа pythagorean для вычисления расстояния.

Я не уверен, как сделать шаг 1 в SQL. По сути, он создает каждую возможную уникальную комбинацию пар из первого столбца и включает в себя соответствующие lat и long для каждого города в паре в этой строке.

Этот подход шикарный? и как я мог его реализовать? Есть ли способ лучше?

Спасибо!

ответ

3

Вы можете выполнить эту задачу с помощью self-join.

select 
d1.name as city1, d2.name as city2, 
d1.lat as lat1, d2.lat as lat2, 
d1.long as long1, d2.long as long2 
from datatable d1 
join datatable d2 on d1.name < d2.name 

Edit: Как улей не поддерживает неравенство включается в версиях ниже 2.2.0, вы можете использовать

select 
d1.name as city1, d2.name as city2, 
d1.lat as lat1, d2.lat as lat2, 
d1.long as long1, d2.long as long2 
from datatable d1 
join datatable d2 on 1=1 
where d1.name < d2.name 
+0

спасибо даст это попробовать – Canovice

+0

ваши переменные путают мне маленький кусочек. не должно d1.city и d2.city быть d1.name и d2.name? и d1 и d2 - одна и та же таблица в моей базе данных, но мы каким-то образом присваиваем им разные имена? – Canovice

+1

Я сожалею о том, что опечатал..и отредактировал его сейчас. Да, они одна и та же таблица, но мы даем им разные столбцы-псевдонимы. –

Смежные вопросы