我正在使用 postgresql 來計算不同點是否在特定范圍內(使用畢達哥拉斯計算)。
問題是我想獲得按接近度而不是隨機排序的結果。
這是我的查詢:
select * from point l where ((abs(l.lat*111139 - myPointLat*111139)^2) (abs(l.lng*111139 - (myPointLng*111139))^2)) <= metres^2;
我想使用查詢的這一部分對其進行排序:
((abs(l.lat 111139 - myPointLat 111139)^2) (abs(l.lng 111139 - (myPointLng 111139))^2))
我怎么能做到這一點?
非常感謝!
uj5u.com熱心網友回復:
如果你想避免重復運算式,你可以在子查詢中添加一個計算列,然后對子查詢進行過濾。
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
Column1、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)
)
uj5u.com熱心網友回復:
檢查這個其他問題How to re-use result for SELECT, WHERE and ORDER BY clauses? 因為我認為這會對你有很大幫助!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/536407.html
上一篇:如何從SpringBoot應用程式執行SpringBatch作業
下一篇:無法使用@mapper映射列舉值
