finish script
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user