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 
		

		
		
		
		
		
		
	