2015-10-05 98 views
0

無限運行的查詢我現在有一個名爲cardata數據庫方案,該方案除其他具有這些列:的Postgres/PostGIS的數據庫 - 與ST_MakeLine

+-------------+-----------------------------+---------------------------------+ 
| tripid(int) | point geometry(point, 4326) | line geometry(linestring, 4326) | 
+-------------+-----------------------------+---------------------------------+ 
| 1   | <data>      |         | 
| 1   | <data>      |         | 

point列包含連續的GPS測量,正因爲如此,我想將它們轉換成線串。整個旅程可以包含數千個點,但是我希望每個點之間都有一個線條。

我曾試圖制訂以此爲update我的表看起來像這樣:

UPDATE cardata 
SET line = ST_MakeLine(foo.point, lead) 
FROM (
    SELECT point, LEAD(point, 1) 
    OVER w 
    FROM cardata 
    GROUP BY point 
    WINDOW w AS (ORDER BY point) 
) AS foo 

WHERE lead IS NOT NULL 

的想法是,對於每一行我用這一點,並在未來做一個線串保存(ST_MakeLine)在第一行(line)。這應該繼續,直到旅程結束,忽略LEAD應該爲空的最後一個條目。

現在我不知道如何制定一個區分不同tripid,但這是另一次的單個查詢。現在我只想在整個表格的所有點之間使用線串。

然而,問題是我的查詢似乎永遠運行,並沒有改變表中的任何內容。我不懂爲什麼。我試着測試內部SELECT查詢的行爲如預期的那樣 - 它返回總共47055行46561行。這也很奇怪,因爲我認爲它應該返回47054行 - 即只能得出結論:對於最後一個條目,LEAD爲空。

最後,我試着在兩個隨機點上運行ST_MakeLine,這似乎工作正常。

是什麼讓這個查詢永遠運行?

+0

你有一個行程內,標誌着該點的順序列?如果不是,那麼數據不可恢復。 –

+0

我有每個入口日誌的ID和時間戳 – Treeline

+0

原諒我是我很笨,但它看起來像我正在製作47000+行,這將是非常緩慢。你的小組並沒有任何影響。 – e4c5

回答

0

我正在使用的另一個人終於找到了一個工作解決方案,雖然我們都不太明白原始查詢究竟出了什麼問題。

因此,我仍然對我的原始問題的答案感興趣,即什麼使查詢永久運行?

這是工作的查詢,這完全按預期工作:

UPDATE cardata 
    SET line = resline 
    FROM(
     SELECT tripid, 
       id, 
       ST_MakeLine(point, next_point) AS resline 
     FROM(
      SELECT tripid, 
        id, 
        point, 
        lead(point) OVER w AS next_point, 
        lead(tripid) OVER w AS next_tripid 
      FROM cardata 
      WINDOW w AS(ORDER BY id) 
     ) AS allcalclines 
     WHERE tripid = 1 AND next_tripid = tripid 
    ) AS calclines 
    WHERE cardata.id = calclines.id