[英]Can I make this SQL query more efficient?
我有一個運行良好的SQL查詢,但我覺得必須有一種更有效的編寫方式。 通過聯接包含坐標的兩個表A和B,我正在比較每個坐標之間的距離(以米為單位)。 然后,我對表B中的坐標數求和/計數,這些坐標在表A中的坐標設定距離之內,並輸出結果:
select a.name,
sum(case when ST_GeodesicLengthWGS84(ST_SetSRID(ST_LineString(a.lat, a.lon, b.lat, b.lon),4326)) < 10.0 then 1 else 0 end) 10mCount,
sum(case when ST_GeodesicLengthWGS84(ST_SetSRID(ST_LineString(a.lat, a.lon, b.lat, b.lon),4326)) < 50.0 then 1 else 0 end) 50mCount,
sum(case when ST_GeodesicLengthWGS84(ST_SetSRID(ST_LineString(a.lat, a.lon, b.lat, b.lon),4326)) < 1000.0 then 1 else 0 end) 1000mCount
FROM a JOIN
b
GROUP BY a.name
ORDER by 1000mCount desc
LIMIT 10;
我覺得必須有一種方法可以調用ST_GeodesicLengthWGS84(ST_SetSRID(ST_LineString(a.lat, a.lon, b.lat, b.lon), 4326))
一次,獲取結果,然后分別遞增10m,50m和1000m計數。
有任何想法嗎? 謝謝。
嘗試進行預查詢,但是您的數據仍然需要結果通過每個記錄。
select
PreQuery.name,
sum(case when PreQuery.Geode < 10.0 then 1 else 0 end) 10mCount,
sum(case when PreQuery.Geode < 50.0 then 1 else 0 end) 50mCount,
sum(case when PreQuery.Geode < 1000.0 then 1 else 0 end) 1000mCount
from
( select
a.name,
ST_GeodesicLengthWGS84( ST_SetSRID( ST_LineString(a.lat, a.lon, b.lat, b.lon),4326)) as Geode
from
a join b
(YOU ARE MISSING the JOIN 'ON' clause... how related) ) PreQuery
GROUP BY
PreQuery.name
ORDER by
1000mCount desc
LIMIT 10;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.