2013-06-27 61 views
1

我已經使用以下PostgreSQL查詢來查找不同源ID的結束時間和下一個開始時間之間的時間差。如何在單獨的列中更新SQL查詢的結果

SELECT obu_id, trip_id, start_time, end_time, dwell_time 
    , end_time - LEAD(start_time) OVER(PARTITION BY obu_id ORDER BY start_time) AS diff 
FROM clean_trips_byobu; 

我所要做的是更新的結果差異正在顯示的列dwell_time(臨時結果,它不被存儲在任何地方),並插入一個值「-1」的,而不是空的空間。請參考下面的截圖。

ScreeShot

期望的結果:

obu_id trip_id start_time   end_time    dwell_time diff 
2  135736 2004-10-29 15:22:14 2004-10-29 16:13:37 -02:01:42 -02:01:42 
2  135738 2004-10-29 18:15:19 2004-10-29 18:28:37 -1 
3  137826 2005-03-17 17:56:41 2005-03-17 18:02:31 -00:05:30 -00:05:30 
3  137826 2005-03-17 18:08:01 2005-03-17 18:12:10 -00:07:51 -00:07:51 
3  137826 2005-03-17 18:20:01 2005-03-17 18:27:51 -14:51:24 -14:51:24 

回答

1

你的問題是難以解析。這是我的猜測,你可能是什麼後:

UPDATE clean_trips_byobu c 
SET dwell_time = COALESCE(u.diff, interval '-1 hour') 
FROM (
    SELECT id, ref, start_time, end_time 
     ,end_time - lead(start_time) OVER(PARTITION BY id 
              ORDER BY start_time) AS diff 
    FROM clean_trips_byobu 
    ) u 
WHERE (c.id, c.ref, c.start_time, c.end_time) 
    =(u.id, u.ref, u.start_time, u.end_time) 
AND c.dwell_time IS DISTINCT FROM COALESCE(u.diff, interval '-1 hour'); 
  • 使用COALESCE()與默認interval更換NULL

  • 在您的UPDATE中將查詢用作子查詢。加入一組獨一無二的專欄。

  • 如果你已經在差異值,添加最後一行,以防止空的更新。

但真的,你應該有一個比4列組合更簡單的方法來識別一個行。我建議代理主鍵。可以與這一行代碼來完成:

ALTER TABLE clean_trips_byobu ADD COLUMN ctb_id serial PRIMARY KEY; 

更多在此密切相關的答案:
Do I need a primary key for my table, which has a UNIQUE (composite 4-columns), one of which can be NULL?

+0

我已經嘗試過了,但它仍然顯示了以下錯誤:錯誤:合併類型的間隔和整數不能匹配。請讓我知道如何克服這個錯誤。非常感謝幫助 – ParveenArora

+1

@ParveenArora:你的問題沒有提供列的數據類型,也沒有提供適當的值,只是「-1」。請多付出一點努力。我添加了一個可能的修復。可能仍然與您的列類型不兼容。 –

+1

親愛的@Erwin Brandsetter我很抱歉在我以前的混亂。我已經按照我的要求更新了這個問題,請看看。道歉! – ParveenArora