#sql-server #datediff
#sql-сервер #datediff
Вопрос:
Я пытаюсь найти разницу во времени между двумя определенными точками в сохраненных разговорах. Эти моменты могут отличаться в каждом разговоре, что затрудняет меня. Мне нужна разница во времени между сообщением агента и первым ответом конечного пользователя после него.
В приведенном ниже примере CaseNr 1234 мне нужна разница во времени между сообщениями 3 и 4, 5 и 6 и 7 и 8. В случае с 2345 мне нужна разница во времени между сообщениями 3amp;4, 5amp;6, 7amp;8 и 10 и 11. В CaseNr 4567 мне нужна разница во времени между 2 и 3 и 4 и 5.
Как показано, агент заказа и конечный пользователь могут отличаться в каждом диалоге, а также позиции, в которых находятся эти типы.
Есть ли способ рассчитать разницу во времени так, как я описал это в SQL server?
Комментарии:
1. Изображения данных действительно не помогают нам помочь вам. Потратьте время на публикацию ваших данных в виде инструкций DDL и DML. Также не забудьте указать ожидаемые результаты, которые вы ищете, и ваши попытки (с объяснением, почему они не сработали)
Ответ №1:
Я думаю, что этот код должен вам помочь.
with t(MessageNr,CaseNr,Type, AgentTime, EndUserTime) as
(
select
t1.MessageNr,
t1.CaseNr,
t1.Type,
t1.EntryTime,
(select top 1 t2.EntryTime
from [Your_Table] as t2
where t1.CaseNr = t2.CaseNr
and t2.[Type] = 'EndUser'
and t1.EntryTime < t2.EntryTime
order by t2.EntryTime) as userTime
from [Your_Table] as t1
where t1.[Type] = 'Agent'
)
select t.*, DATEDIFF(second, AgentTime, EndUserTime)
from t;
Ответ №2:
Похоже, что требуемая вам логика — это разница во времени между Agent
строкой и следующей EndUser
строкой.
Вы можете сделать это с LEAD
помощью , которая будет более производительной, чем использование самосоединений.
SELECT *,
DATEDIFF(second, t.EntryTime, t.NextTime) TimeDifference
FROM (
SELECT *,
LEAD(CASE WHEN t.[Type] = 'EndUser' THEN t.EntryTime END) NextTime
FROM myTable t
) t
WHERE t.[Type] = 'Agent'
AND t.NextTime IS NOT NULL