SQL-查找两个城市之间的距离,必须格式化表格

SQL-查找两个城市之间的距离,必须格式化表格,sql,hive,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 ... 我需要找到彼此之间有一定距离的所有城市,距离用纬度和经度来衡量 我目前对如何解决这一问题的看法如下: name lat long NY

我是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
...
我需要找到彼此之间有一定距离的所有城市,距离用纬度和经度来衡量

我目前对如何解决这一问题的看法如下:

name     lat     long
NY       40.3    70.3
SF       36.1    60.2
LA       36.5    53.1
CH       45.2    62.3
...
  • 如果有n=10个城市(因此表中有n=10行),则创建一个包含(10*9)/2=45行的新表,其中每行现在有6列(city1、city2、lat1、lat2、long1、long2)
  • 对于这种格式的行,我可以简单地使用类似毕达哥拉斯的计算来计算距离
  • 我不知道如何在SQL中执行步骤1。基本上,它从第一列创建每一个可能的唯一对组合,并包括该行对中每个城市对应的lat和long

    这种方法明智吗?我如何实现它?有更好的办法吗


    谢谢

    您可以通过
    自连接来完成此任务

    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
    
    选择
    d1.名称为城市1,d2.名称为城市2,
    d1.lat为lat1,d2.lat为lat2,
    d1.长得一样长,d2.长得一样长
    从数据表d1
    在d1.name
    编辑:由于配置单元不支持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
    
    选择
    d1.名称为城市1,d2.名称为城市2,
    d1.lat为lat1,d2.lat为lat2,
    d1.长得一样长,d2.长得一样长
    从数据表d1
    在1=1时联接数据表d2
    其中d1.name
    您可以通过
    自连接来完成此任务

    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
    
    选择
    d1.名称为城市1,d2.名称为城市2,
    d1.lat为lat1,d2.lat为lat2,
    d1.长得一样长,d2.长得一样长
    从数据表d1
    在d1.name
    编辑:由于配置单元不支持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
    
    选择
    d1.名称为城市1,d2.名称为城市2,
    d1.lat为lat1,d2.lat为lat2,
    d1.长得一样长,d2.长得一样长
    从数据表d1
    在1=1时联接数据表d2
    其中d1.name
    您的变量让我有点困惑。d1.city和d2.city不应该是d1.name和d2.name吗?d1和d2在我的数据库中是同一个表,但我们不知何故为它们指定了不同的名称?很抱歉输入错误..我现在编辑了它..是的,它们是同一个表,但我们为它们指定了不同的列别名。datatable是关键字,还是我的表名?-是的,这是个愚蠢的问题。我不知道我们可以在d1和d2中使用两个版本的表,thanksit是您的表的名称。Hive中只支持相等联接、外部联接和左半联接。配置单元不支持非相等条件的联接条件,因为很难将此类条件表示为映射/减少作业。您的变量有点让我困惑。d1.city和d2.city不应该是d1.name和d2.name吗?d1和d2在我的数据库中是同一个表,但我们不知何故为它们指定了不同的名称?很抱歉输入错误..我现在编辑了它..是的,它们是同一个表,但我们为它们指定了不同的列别名。datatable是关键字,还是我的表名?-是的,这是个愚蠢的问题。我不知道我们可以在d1和d2中使用两个版本的表,thanksit是您的表的名称。Hive中只支持相等联接、外部联接和左半联接。配置单元不支持非相等条件的联接条件,因为很难将此类条件表示为映射/减少作业。