Files
test-tasks/egeland/sql/Script.sql
Basyrov Rustam 5a9e08345c finish sql
2024-12-19 16:34:39 +03:00

66 lines
3.1 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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