我正在使用postgresql来计算不同的点是否在一个特定的范围内(使用毕达哥拉斯计算)
问题是我希望得到的结果是按接近度排序的,而不是随机的。
这是我的查询:
select * from point l where ((abs(l.lat*111139 - myPointLat*111139)^2) + (abs(l.lng*111139 - (myPointLng*111139))^2)) <= metres^2;
我想使用查询的这一部分对它进行排序:
((abs (l。lat111139 - myPointLat111139)^2) + (abs(l。lng111139 - (myPointLng111139))^2)
我怎样才能做到这一点?
非常感谢!
如果希望避免重复表达式,可以在子查询中添加计算列,然后在子查询上执行过滤。
select Column1, Column2, Column3 from
(
select *,
(
(abs(l.lat*111139 - myPointLat*111139)^2) +
(abs(l.lng*111139 - (myPointLng*111139))^2)
) as proximity
from point l
)
where proximity <= metres^2
order by proximity
columnn1, Column2, Column3是您感兴趣的原始point
表中的列。
性能方面,最好只是重复表达式,因为这样Postgres肯定可以先做过滤,这意味着它必须处理一个潜在的小得多的数据集,这将更快:
select *
from point l
where (
(abs(l.lat*111139 - myPointLat*111139)^2) +
(abs(l.lng*111139 - (myPointLng*111139))^2)
) <= metres^2
order by (
(abs(l.lat*111139 - myPointLat*111139)^2) +
(abs(l.lng*111139 - (myPointLng*111139))^2)
)
检查另一个问题如何重用SELECT, WHERE和ORDER BY子句的结果?因为我觉得这会对你有很大帮助!