2013-06-27 60 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