查找聊天对话中的平均等待时间

问题描述 投票:0回答:2

我想知道客户在聊天对话中等待项目经理回复的平均时间。

我需要确保它只计算连续最后一条客户端消息的等待时间。例如。客户连续写了五条消息,然后客户经理在两个小时后回复,那么我们应该忽略客户的前四条消息。

我也只对项目对话感兴趣,所以我需要忽略任务对话

我们正在使用 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 小时

我还想知道这个数字是如何随时间变化的,所以我需要按月分组。

非常感谢您对此的任何帮助!

我尝试了各种方法都没有成功。

sql postgresql window-functions
2个回答
1
投票

在角色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'

dbfiddle 演示


0
投票

这里是测试数据:

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
© www.soinside.com 2019 - 2024. All rights reserved.