finish script

This commit is contained in:
Basyrov Rustam
2024-12-18 22:50:16 +03:00
parent 5cd365a113
commit 38c32701e7

View File

@@ -160,12 +160,17 @@ select greatest(cast(to_timestamp(1729931470) as time),
with tmp_table2 as with final_table2 as
(with tmp_table as (with pre_table as
(select (select
*, *,
-- Перевод из unix-времени в обычное
cast(to_timestamp(created_at) as time) as dtime, 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, 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 row_number() over(partition by entity_id order by created_at) as num
from from
chat_messages cm chat_messages cm
@@ -173,6 +178,11 @@ order by entity_id, created_at)
select select
*, *,
dtime, dtime,
-- учет нерабочего времени, возможны 4 варианта
-- 1) менеджер ответил ночью -- тогда время ответа равно 24:00 - `время сообщения клиента`
-- 2) клиент написал ночью -- тогда время ответа отсчитывается от 09:30
-- 3) клиент написал днем, а менеджер ответил на след. день -- тогда время ответа равно модулю
-- разности времен сообщений (сделано через `greates`, так как interval не поддерживается `abs`)
case when (dtime < '09:30:00'::time and created_by <> 0) 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) 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) when (dtime < '09:30:00'::time and created_by = 0)
@@ -182,21 +192,27 @@ select
lag(dtime) over(partition by entity_id order by created_at) - dtime) 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) else dtime - lag(dtime) over(partition by entity_id order by created_at)
end as diff_time end as diff_time
from tmp_table from pre_table
where tmp_table.not_dupl where
-- игнорируем дупликаты
pre_table.not_dupl
and and
not (tmp_table.num = 1 and tmp_table.created_by <> 0)) -- игнорируем записи в сделках, которые начинаются с сообщения менеджера
not (pre_table.num = 1 and pre_table.created_by <> 0))
select select
r.rop_name, r.rop_name,
m.name_mop, m.name_mop,
-- приведение к timestamp для фильтрации в datalens
cast(to_timestamp(created_at) as timestamp) as datetime, cast(to_timestamp(created_at) as timestamp) as datetime,
diff_time diff_time
from from
tmp_table2 as tt2 -- обычный INNER JOIN трех таблиц
final_table2 as ft2
join join
managers as m on m.mop_id = tt2.created_by managers as m on m.mop_id = ft2.created_by
join join
rops as r on r.rop_id = m.rop_id::int4 -- пришлось привести m.rop_id к int4, так как разные типы
rops as r on r.rop_id = cast(m.rop_id as int4)
where where
created_by <> 0 created_by <> 0