根据特定条件获取不同时间戳之间的时间

Get the time between different timestamps based on a particular condition

我有这个table:

user_id | status  | timestamp
--------+---------+--------------------
null    | null    | 2022-05-05 01:01:00
null    | null    | 2022-05-05 01:02:00
7461    | null    | 2022-05-05 01:03:00
null    | open    | 2022-05-05 01:04:00
null    | null    | 2022-05-05 01:05:00
null    | on hold | 2022-05-05 01:06:00
8474    | null    | 2022-05-05 01:07:00
null    | null    | 2022-05-05 01:08:00
null    | solved  | 2022-05-05 01:09:00

我需要找出从分配 user_id 到第一次状态更改之间的时间差。另外,如果在分配下一个用户之前状态没有变化,那么我需要找到从分配第一个 user_id 到分配下一个 user_id 的时间差。

我正在寻找的输出是

user_id | timestamp
--------+----------
7461    | 00:01:00
8474    | 00:02:00

可以使用 CTE 吗?用需要的数据制作一个单独的 table 并计算差异?任何帮助将不胜感激。

with data as (
    select *,
        count(user_id) over (order by timestamp) as grp,
        lead(timestamp) over (order by timestamp) as next_ts
    from T
)
select
    min(user_id) as user_id,
    min(timestamp) as start_time,
    coalesce(
        min(case when status is not null then timestamp end),
        max(next_ts)
    ) as end_time
from data
group by grp

您的数据似乎没有显示无状态案例的示例 change/update。然后还不清楚您希望如何处理到达数据末尾时发生的情况。

由于我无法访问 Snowflake,我会让您处理计算和显示两个时间之间差异的问题。

https://dbfiddle.uk/?rdbms=postgres_10&fiddle=e6354448c6142d0493141b4d67477f73