如何从两个不同的表格中获取最近城市的距离并将其合并为PostgreSQL中的1列

时间:2019-12-18 07:04:45

标签: postgresql metabase

我现在在这种模式下呆了几天。

我正在尝试在与其他2个表不同的表中填充距离列。表格内有纬度,经度,城市ID,距离和位置ID。

这是我要填充的当前表 Distance

这是我可以用来计算距离的两个表格 First Table

Second table

LocationID与第一个表中的ID相同 为了计算到最近的城市的距离,我使用lat long来计算,这就是我的代码对于最近的距离的样子

select location_id, distance
from (SELECT  t.table1.location_id as location_id,
                ( 6371 * acos( cos( radians(6.414478) ) * 
                    cos( radians(t.table1.latitude::float8) ) * 
                        cos( radians(t.table1.longitude::float8) - radians(12.466646) )
                            + sin( radians(6.414478) ) * sin( radians(t.table1.latitude::float8) ) ) ) AS distance 
    FROM t.table1
    INNER JOIN t.table2
    on t.table1.location_id = t.table2.id
) km 
group by location_id, distance
Having distance < 2000 
order by distance limit 20;

但表仅返回空值

我将PostgreSQL用于此代码,用于可视化的应用程序是元数据库。

2 个答案:

答案 0 :(得分:1)

我建议您使用PostGIS扩展名中的ST_Distance函数进行距离计算,而不要自己做。这样会更容易,而且肯定会更快。

答案 1 :(得分:0)

编辑:可能是误解了最初的意图。
这应该可行:

select d.city_id, d.distance, latitude,location_id, longitude 
from t.table1
left join lateral (
    select city_id, distance from (
        select location_id city_id, ( 6371 * acos( cos( radians(table3.latitude) ) * 
                        cos( radians(t.table1.latitude::float8) ) * 
                            cos( radians(t.table1.longitude::float8) - radians(table3.longitude) )
                                + sin( radians(table3.latitude) ) * sin( radians(t.table1.latitude::float8) ) ) ) AS distance 
        from t.table3
    ) d
    where distance < 2000
    order by distance 
    limit 1
) cities on true 

尝试一下。
最好的问候,
比尼亚尼