如何找到下一个日期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 | state | ctime | endtime考虑将结束时间作为下一个状态的开始时间(ctime)

不可能向表"UserState"添加新列。但是,有可能(id = 1)的用户在相同的状态"Ready"之后有状态"Ready",这些状态必须分组到1行。

窗口函数会这样做:

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

这正是窗口函数所能做的。本例中,可以使用lead()函数

最新更新