227 lines
5.8 KiB
SQL
227 lines
5.8 KiB
SQL
drop table if exists clients_initial_timestamps;
|
||
|
||
|
||
create temporary table clients_initial_timestamps as
|
||
select
|
||
entity_id,
|
||
created_at as init_time
|
||
FROM
|
||
(SELECT
|
||
entity_id,
|
||
created_at,
|
||
row_number() over by_users as place
|
||
from
|
||
db1.test.chat_messages cm
|
||
where created_by = 0
|
||
window by_users as
|
||
(partition by entity_id, created_by order by created_at)) t1
|
||
where t1.place = 1;
|
||
|
||
select * from clients_initial_timestamps;
|
||
|
||
drop table if exists managers_response_timestamps;
|
||
create temporary table managers_response_timestamps as
|
||
select
|
||
entity_id,
|
||
created_by as mop_id,
|
||
created_at as responce_time
|
||
from
|
||
(SELECT
|
||
entity_id,
|
||
created_by,
|
||
created_at,
|
||
row_number() over by_users as place
|
||
from
|
||
db1.test.chat_messages cm
|
||
where created_by <> 0
|
||
window by_users as
|
||
(partition by entity_id, created_by order by created_at)) t1
|
||
where
|
||
t1.place = 1;
|
||
|
||
select * from managers_response_timestamps;
|
||
|
||
|
||
select
|
||
*,
|
||
mrt.responce_time - cit.init_time as delta
|
||
from
|
||
clients_initial_timestamps as cit
|
||
join
|
||
managers_response_timestamps as mrt
|
||
on cit.entity_id = mrt.entity_id;
|
||
|
||
select
|
||
entity_id,
|
||
count(*) as cnt
|
||
from
|
||
db1.test.chat_messages cm
|
||
group by entity_id
|
||
order by cnt desc
|
||
|
||
select
|
||
created_by,
|
||
created_at,
|
||
rank() over(order by created_by) as dr
|
||
from
|
||
db1.test.chat_messages cm
|
||
where entity_id = 36541651
|
||
order by created_at
|
||
|
||
|
||
select
|
||
*,
|
||
row_number() over(partition by entity_id order by created_at)
|
||
from
|
||
chat_messages cm
|
||
|
||
|
||
|
||
|
||
|
||
|
||
select
|
||
type,
|
||
entity_id,
|
||
created_by,
|
||
created_at,
|
||
created_at - lag(created_at) over(partition by entity_id, type order by created_at) as prev_msg_time,
|
||
rank() over(partition by entity_id, type order by created_at) as nm
|
||
from
|
||
chat_messages cm
|
||
where
|
||
entity_id = 37548545
|
||
order by created_at
|
||
offset 1;
|
||
|
||
with tmp as
|
||
(select
|
||
created_by,
|
||
created_at,
|
||
created_by = lag(created_by) over(order by created_at) as test
|
||
from
|
||
chat_messages cm
|
||
where
|
||
entity_id = 37548545
|
||
order by created_at)
|
||
select
|
||
*
|
||
from tmp
|
||
where tmp.test = false or tmp.test is null
|
||
|
||
|
||
select
|
||
entity_id,
|
||
created_at,
|
||
created_by,
|
||
created_by = lag(created_by) over(partition by entity_id order by created_at) as tmp
|
||
from
|
||
chat_messages cm
|
||
order by created_at
|
||
|
||
-- result
|
||
with tmp as
|
||
(select
|
||
*,
|
||
created_at - lag(created_at) over(order by created_at) as diff
|
||
from
|
||
chat_messages cm
|
||
)
|
||
select
|
||
-- *
|
||
tmp.created_by,
|
||
avg(diff)
|
||
from
|
||
tmp
|
||
where
|
||
tmp.diff is not null
|
||
and
|
||
tmp.created_by <> 0
|
||
group by tmp.created_by
|
||
|
||
|
||
|
||
select
|
||
created_by,
|
||
extract(day from cast(to_timestamp(created_at) as date)) as time_casted,
|
||
avg(cast(to_timestamp(created_at) as time)) over() as test
|
||
from
|
||
chat_messages cm
|
||
|
||
|
||
select cast(to_timestamp(1729931470) as time)
|
||
|
||
select greatest(cast(to_timestamp(1729931470) as time),
|
||
'12:00:00') as test
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
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
|
||
chat_messages cm
|
||
order by entity_id, created_at)
|
||
select
|
||
*,
|
||
dtime,
|
||
-- учет нерабочего времени, возможны 4 варианта
|
||
-- 1) менеджер ответил ночью -- тогда время ответа равно 24:00 - `время сообщения клиента`
|
||
-- 2) клиент написал ночью -- тогда время ответа отсчитывается от 09:30
|
||
-- 3) клиент написал днем, а менеджер ответил на след. день -- тогда время ответа равно модулю
|
||
-- разности времен сообщений (сделано через `greates`, так как interval не поддерживается `abs`)
|
||
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 greatest(dtime - lag(dtime) over(partition by entity_id order by created_at),
|
||
lag(dtime) over(partition by entity_id order by created_at) - dtime)
|
||
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,
|
||
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
|
||
|
||
select abs('09:35:00'::time - '09:36:00'::time)
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|