66 lines
3.1 KiB
SQL
66 lines
3.1 KiB
SQL
with final_table2 as
|
||
(with pre_table as
|
||
(select
|
||
*,
|
||
-- Перевод из unix-времени в обычное
|
||
cast(to_timestamp(created_at) as time) as dtime,
|
||
-- удаление подряд идущих сообщений от одного пользователя по принципу проверки равенства
|
||
-- между автором текущего и предыдущего сообщения (true, если авторы разные)
|
||
-- coalesce -- чтобы NULL заменить на true у первого сообщения в сделке
|
||
coalesce(created_by <> lag(created_by) over(partition by entity_id order by created_at), true) as not_dupl,
|
||
-- нумерация записей внутри сделки, чтобы все сделки начинались с сообщения клиента
|
||
row_number() over(partition by entity_id order by created_at) as num
|
||
from
|
||
db1.test.chat_messages cm
|
||
order by entity_id, created_at)
|
||
select
|
||
*,
|
||
dtime,
|
||
-- учет нерабочего времени, возможны 4 варианта
|
||
-- 1) менеджер ответил ночью -- тогда время ответа равно 24:00 - `время сообщения клиента`
|
||
-- 2) клиент написал ночью -- тогда время ответа отсчитывается от 09:30
|
||
-- 3) клиент написал днем, а менеджер ответил на след. день -- тогда время ответа равно
|
||
-- разности времен сообщений за вычетом ночного времени
|
||
-- 4) обычный вариант, тогда просто разность
|
||
case when (dtime < '09:30:00'::time and created_by <> 0)
|
||
then '24:00:00'::time - lag(dtime) over(partition by entity_id order by created_at)
|
||
when (dtime < '09:30:00'::time and created_by = 0)
|
||
then dtime -'09:30:00'::time
|
||
when (lag(dtime) over(partition by entity_id order by created_at) > dtime)
|
||
then lag(dtime) over(partition by entity_id order by created_at) - dtime - '09:30:00'::time
|
||
else dtime - lag(dtime) over(partition by entity_id order by created_at)
|
||
end as diff_time
|
||
from pre_table
|
||
where
|
||
-- игнорируем дупликаты
|
||
pre_table.not_dupl
|
||
and
|
||
-- игнорируем записи в сделках, которые начинаются с сообщения менеджера
|
||
not (pre_table.num = 1 and pre_table.created_by <> 0))
|
||
select
|
||
r.rop_name,
|
||
m.name_mop,
|
||
-- приведение к timestamp для фильтрации в datalens
|
||
cast(to_timestamp(created_at) as timestamp) as datetime,
|
||
-- datalens не поддерживает тип данных interval
|
||
extract(epoch from diff_time) as diff_time,
|
||
avg(extract(epoch from diff_time)) over(partition by r.rop_name, m.name_mop) as avg_diff_time
|
||
from
|
||
-- обычный INNER JOIN трех таблиц
|
||
final_table2 as ft2
|
||
join
|
||
managers as m on m.mop_id = ft2.created_by
|
||
join
|
||
-- пришлось привести m.rop_id к int4, так как разные типы
|
||
rops as r on r.rop_id = cast(m.rop_id as int4)
|
||
where
|
||
created_by <> 0
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|