diff --git a/egeland/sql/Script.sql b/egeland/sql/Script.sql index 41c4a55..a0ec7e5 100644 --- a/egeland/sql/Script.sql +++ b/egeland/sql/Script.sql @@ -160,12 +160,17 @@ select greatest(cast(to_timestamp(1729931470) as time), -with tmp_table2 as -(with tmp_table as +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 @@ -173,6 +178,11 @@ 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) @@ -182,21 +192,27 @@ select 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 tmp_table -where tmp_table.not_dupl +from pre_table +where + -- игнорируем дупликаты + pre_table.not_dupl and - not (tmp_table.num = 1 and tmp_table.created_by <> 0)) + -- игнорируем записи в сделках, которые начинаются с сообщения менеджера + 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 - tmp_table2 as tt2 + -- обычный INNER JOIN трех таблиц + final_table2 as ft2 join - managers as m on m.mop_id = tt2.created_by + managers as m on m.mop_id = ft2.created_by 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 created_by <> 0