我想知道客户在聊天对话中等待项目经理回复的平均时间。
我需要确保它只计算连续最后一条客户端消息的等待时间。例如。客户连续写了五条消息,然后客户经理在两个小时后回复,那么我们应该忽略客户的前四条消息。
我也只对项目对话感兴趣,所以我需要忽略任务对话
我们正在使用 PostgreSQL 14.7.
表格看起来像这样(简化):
用户
id | 角色 |
---|---|
153 | 客户经理 |
157 | 客户 |
role 是 client 或 account_manager
对话
id | object_type |
---|---|
12 | 项目 |
13 | 任务 |
object_type 是项目或任务
消息
id | user_id | conversation_id | 创建于 |
---|---|---|---|
1133 | 157 | 12 | 2023-04-19 13:05:48 |
1157 | 157 | 12 | 2023-04-19 13:06:00 |
1163 | 157 | 12 | 2023-04-19 13:15:00 |
1178 | 153 | 12 | 2023-04-19 14:15:00 |
1209 | 157 | 12 | 2023-04-20 10:23:00 |
1327 | 153 | 12 | 2023-04-20 14:23:00 |
在上面的示例中,平均时间为 (1+4)/2= 2.5 小时
我还想知道这个数字是如何随时间变化的,所以我需要按月分组。
非常感谢您对此的任何帮助!
我尝试了各种方法都没有成功。
在角色account_amanger 和之前的角色client 中取行,使用lag()。然后算平均数:
select avg (created_at - prev_time)
from (
select m.*, u.role, lag(u.role) over (order by created_at) prev_role,
lag(created_at) over (order by created_at) prev_time
from messages m join users u on u.id = m.user_id
where m.conversation_id = 12) m
where role = 'account_manager' and prev_role = 'client'
这里是测试数据:
create table users (id integer, role varchar(50));
insert into users values
(153, 'account_manager'),
(157, 'client');
-- select * from users;
create table conversations (id integer, object_type varchar(50));
insert into conversations values
(12, 'project'),
(13, 'task');
-- select * from conversations;
create table messages (id integer, user_id integer, conversation_id integer,
created_at timestamp);
insert into messages values
(1133, 157, 12, '2023-04-19 13:05:48'),
(1157, 157, 12, '2023-04-19 13:06:00'),
(1163, 157, 12, '2023-04-19 13:15:00'),
(1178, 153, 12, '2023-04-19 14:15:00'),
(1209, 157, 12, '2023-04-20 10:23:00'),
(1327, 153, 12, '2023-04-20 14:23:00');
-- select * from messages;
现在查询:
with user_messages as (
select * from messages
where user_id = (select id from users where role = 'client' limit 1)),
manager_messages as (
select * from messages
where user_id = (select id from users where role = 'account_manager' limit 1))
select avg(tm.created_at - tu.created_at)
from manager_messages tm LEFT OUTER JOIN user_messages tu
on tu.created_at = (select coalesce(max(um.created_at),tm.created_at)
from user_messages um
where um.created_at < tm.created_at);
avg
----------
02:30:00