2016-07-06 58 views
0

我有一個SQL查詢工作正常,但我覺得必須有一個更有效的寫作方式。通過加入兩個包含座標的表A和B,我將比較每個座標之間的距離(以米爲單位)。然後我總結/計數表B中的座標數是座標的設定距離內表A和輸出結果:我可以使這個SQL查詢更有效嗎?

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計數。

任何想法? 謝謝。

+0

你還沒有指定任何連接標準 - 你是否真的想要一個交叉連接(b中的每一行加入的每一行)? – Bohemian

+0

你的權利,我只是意識到我不需要加入。但是,我在做這個總和(case when)時最接近最有效的方式嗎? – mike

+0

**我不需要連接**,您已經有一個連接 - 這是一個低效連接(它是一個「交叉連接」)。您需要更好的連接才能使您的查詢更高效。 –

回答

1

嘗試prequerying,但您的數據仍然需要結果通過每個記錄。

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; 
相關問題