根据时间戳和状态变化计算每个用户对每张票的处理时间
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
我有一个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 |