SQL Server: использовать функцию после определенного значения в таблице

#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