【问题标题】:Interval between two dates on a state change状态变化的两个日期之间的间隔
【发布时间】:2022-01-27 21:29:38
【问题描述】:

所以我有一个像这样的vehicle_states 表:

 vehicle_id |     state      |          updated_at
------------+----------------+-------------------------------
 ACX-685    | idle           | 2021-12-24 15:13:09.071822+00
 ACX-685    | active         | 2021-12-24 16:03:41+00
 ACX-685    | out-of-service | 2021-12-24 16:15:34.822808+00
 ACX-685    | idle           | 2021-12-24 16:15:35.822808+00
 ACX-685    | active         | 2021-12-24 16:40:23+00
 ACX-685    | idle           | 2021-12-24 16:40:37.436949+00
 ACX-685    | active         | 2021-12-24 16:40:38+00

对于每种车辆和停止服务状态,我想找出从这种状态过渡所需的时间。车辆停用了多长时间。

我想获得一个表格,其中包含车辆 ID、车辆停用时的时间戳和指定车辆停用时间间隔的第三列,如下所示:

 vehicle_id |       out_of_service_at       | out_of_service_for
------------+-------------------------------+--------------------
 ACX-685    | 2021-12-24 16:15:34.822808+00 | 00:00:01
 BRT-162    | 2021-12-25 11:26:31.827361+00 | 00:00:27

【问题讨论】:

  • 您正在寻找车辆处于“停止服务”状态的时间?为清楚起见,您能否分享 vehicle_id BRT-162 的数据
  • @GeorgeJoseph 是的,没错。 BRT-162 示例不是真实的,但原理是相同的,即 state = 'out-of-service' 行上的特定 updated_at 与非“out-of-state”状态的经过时间之间的差异看到同一辆车(总是及时向前)。谢谢!

标签: sql postgresql


【解决方案1】:

你可以使用窗口函数来解决这个问题:

with data as (
select 
    *,
    lead(updated_at) over (partition by vehicle_id order by updated_at) next_state
from vehicles
) select 
    *,
    (next_state - updated_at) out_of_service_for
from data where state = 'out-of-service';

PostgreSQL window functions

【讨论】:

  • 我不能投票,但我认为这是正确的答案。谢谢!
  • @AdolfoSilva,我的意思是你可以接受这个答案
猜你喜欢
  • 2015-08-06
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多