我有下表" 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行。
答案 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()
功能。