2015-09-13 65 views
1

這個問題連接到this:更新同桌計算的距離

我可以計算出的距離與新的條目,並插入到第4列名爲距離。但是現在我需要使用ST_Distance的更新查詢來計算現有GPS座標的漸進距離並存儲到距離列中。任何想法如何用我現有的餐桌設計來實現?

回答

0

在更新現有行的值時,您需要標識每個device_id之前的行。您可以通過"timestamp"與窗函數做到這一點,劃分由device_id和排序行,像這樣:

UPDATE my_table SET distance = cum_dist 
FROM (
    SELECT dev, t, sum(d) OVER (PARTITION BY dev ORDER BY t) AS cum_dist 
    FROM (
    SELECT mt.device_id AS dev, mt."timestamp" AS t, 
      coalesce(ST_Distance(mt.GPS_location, lag(mt.GPS_location) OVER (PARTITION BY mt.device_id ORDER BY mt."timestamp")), 0.) AS d 
    FROM my_table mt 
) sub2 
) sub 
WHERE my_table.device_id = sub.dev 
    AND my_table."timestamp" = sub.t; 

解釋幾句:

  • 最內層查詢sub2計算距離到特定設備的以前的GPS位置。它使用lag() function這樣做,coalesce()函數確保系列中的第一個點距離爲0而不是NULL
  • 在下一個查詢sub中,再次使用窗口函數計算累積距離,但這次是使用衆所周知的聚合函數sum()
  • 然後通過使用device_id"timestamp"列將查詢sub鏈接到表,將累積距離「更新到」表中。

與所有更新一樣,首先運行查詢以查看它是否生成正確的結果,然後執行UPDATE

+0

我首先嚐試使用select子句,但缺少括號,我添加了別名的括號,然後它抱怨device_id不存在。這就是別名的樣子:FROM「my_table」mt)s) – user2304819

+0

確實有一個括號和別名缺失;看到更新的答案。 'device_id'應該沒有問題,但是添加表限定符只是爲了確保。你能再次檢查嗎? – Patrick