根据时间戳和状态变化计算每个用户对每张票的处理时间

Calculate handling time per user for every ticket based on timestamps and status changes

我有一个table。

user_id | ticket_id | status  | timestamp
null    |   1234    | null    | 2022-05-05 01:01:00
null    |   1234    | null    | 2022-05-05 01:02:00
7461    |   1234    | null    | 2022-05-05 01:03:00
null    |   1234    | open    | 2022-05-05 01:04:00
null    |   1234    | null    | 2022-05-05 01:06:00
null    |   1234    | on hold | 2022-05-05 01:09:00
8474    |   1234    | null    | 2022-05-05 01:10:00
null    |   1234    | null    | 2022-05-05 01:11:00
null    |   1234    | solved  | 2022-05-05 01:12:00
2638    |   1245    | null    | 2022-05-05 01:13:00
null    |   1245    | null    | 2022-05-05 01:16:00
5721    |   1245    | null    | 2022-05-05 01:17:00

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

我正在寻找的输出是

user_id | ticket_id  | timestamp
7461    |   1234     | 00:01:00
8474    |   1234     | 00:02:00
2638    |   1245     | 00:04:00

如有任何帮助,我们将不胜感激。

这是我已经尝试过的并且在 MySQL 中有效。但是在这种情况下我不能使用 MySQL。

   SELECT t1.user_id, t1.ticket_id
      MIN(SEC_TO_TIME(TIMESTAMPDIFF(SECOND, t1.timestamp, t2.timestamp))) AS timestamp
FROM tab t1
INNER JOIN tab t2
       ON t1.timestamp < t2.timestamp
      AND t1.user_id IS NOT NULL
      AND t2.status IS NOT NULL 
GROUP BY t1.user_id, t1.ticket_id

我使用了与有问题的帖子类似的查询,并添加了一些内容 - 每个 user_id 用于排在 select 顶行 忽略具有 NULL 时间戳差异的行。 使用 TO_TIME 将 timestampdiff 返回的整数值转换回时间值。

with data_cte (user_id,ticket_id,status,timestamp_1) as
(select * from values
(null,1234,null,'2022-05-05 01:01:00'::timestamp),
(null,1234,null,'2022-05-05 01:02:00'::timestamp),
(7461,1234,null,'2022-05-05 01:03:00'::timestamp),
(null,1234,'open','2022-05-05 01:04:00'::timestamp),
(null,1234,null,'2022-05-05 01:06:00'::timestamp),
(null,1234,'on hold','2022-05-05 01:09:00'::timestamp),
(8474,1234,null,'2022-05-05 01:10:00'::timestamp),
(null,1234,null,'2022-05-05 01:11:00'::timestamp),
(null,1234,'solved','2022-05-05 01:12:00'::timestamp),
(2638,1245,null,'2022-05-05 01:13:00'::timestamp),
(null,1245,null,'2022-05-05 01:16:00'::timestamp),
(5721,1245,null,'2022-05-05 01:17:00'::timestamp)
), cte_1 as
(
select
a.user_id,
a.ticket_id,
a.status,
a.timestamp_1 ts1,
b.timestamp_1 ts2
from data_cte a
left join
data_cte b
on a.timestamp_1 < b.timestamp_1
and
(b.status != nvl(a.status,'0') and b.status is not null)
or
(a.timestamp_1 < b.timestamp_1
and a.user_id != b.user_id)
)
select user_id, 
ticket_id, 
to_time(''||timestampdiff(second,ts1,ts2)||'') f -- to convert int value from timestampdiff to time.
from cte_1
where user_id is not NULL and f is not NULL
qualify row_number() over (partition by user_id order by f asc) < 2  -- to select top row for each user_id
order by f;
USER_ID TICKET_ID F
7461 1234 00:01:00
8474 1234 00:02:00
2638 1245 00:04:00