【问题标题】:How to find the next date PostgreSQL如何找到下一个日期 PostgreSQL
【发布时间】:2017-06-02 16:16:31
【问题描述】:

我有下表“用户状态”:

_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 查询,它将为我提供每个状态的以下数据:

用户名 |状态 | ctime |结束时间 将结束时间视为下一个状态的开始时间(ctime)

无法向“UserState”表添加新列。但有可能,具有 (id = 1) 的用户可能在相同状态“就绪”之后具有状态“就绪”,这些状态必须分组为 1 行。

【问题讨论】:

  • 当 ID #1 的用户被分组时,ctime 是什么?第一个还是最后一个?这只发生在#1 上?

标签: sql postgresql


【解决方案1】:

窗口函数会这样做:

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

如果你不习惯window函数,请看Postgres手册:
http://www.postgresql.org/docs/current/static/tutorial-window.html

【讨论】:

  • @user3824666 这假设您想要下一个日期.. 这不是 最近的 日期,如果最接近的日期在之前怎么办?
【解决方案2】:

这正是window functions 可以做到的。这种情况下,可以使用lead()函数。

【讨论】:

  • 也谢谢你。对我来说,窗口函数的工作原理并不总是很明显。
猜你喜欢
  • 1970-01-01
  • 2019-07-09
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多