我有如下表"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()
函数