如何找到PostgreSQL的下一个日期

时间:2014-07-10 09:22:38

标签: sql postgresql

我有下表" UserState":

_id___|_ctime____________________________|_state__________|_userid
 1    | 2014-06-09 05:57:07.033334+00    | Ready          | 1
 2    | 2014-06-09 05:53:35.243864+00    | Busy           | 1
 3    | 2014-06-09 05:51:39.412722+00    | Ready          | 1
 4    | 2014-06-09 05:48:48.09651+00     | logged out     | 1

* ctime表示用户获取新状态的时间。 这个表意味着,我只有国家的开始时间,但不知道结束时间。 州的结束时间是另一个的开始时间。

我需要一个SQL查询,它将为每个州提供以下数据:

userid |州| ctime |结束时间 将endtime视为下一个状态的开始时间(ctime)

无法向表中添加新列" UserState"。但有可能,(id = 1)的用户可能拥有状态' Ready'在相同的状态' Ready'之后,这些状态必须分为1行。

2 个答案:

答案 0 :(得分:2)

窗口函数将执行此操作:

select userid,
       state,
       ctime as start_time, 
       lead(ctime) over (partition by userid order by ctime) as end_time
from userstate;

如果您不熟悉窗口功能,请参阅Postgres手册:
http://www.postgresql.org/docs/current/static/tutorial-window.html

答案 1 :(得分:0)

这正是window functions可以做的。在这种情况下,您可以使用lead()功能。