microsoft sql server datediff для нескольких дат

#sql-server-2008

#sql-server-2008

Вопрос:

Мне нужно найти промежуток времени между 2 датами (типы datetime) на основе уникального идентификатора. Например, у меня есть следующие данные:

 ID                 CallID                         Starttime                   
1                  56                             2011-01-04 10:00:00.000
1                  67                             2011-03-20 12:20:00.000
1                  70                             2011-04-08 15:00:00.000
2                  57                             2011-01-14 11:00:00.000
2                  62                             2011-02-14 11:00:00.000
2                  64                             2011-02-15 11:00:00.000
2                  75                             2011-04-14 11:00:00.000
2                  78                             2011-05-14 11:00:00.000
  

Мне нужно найти промежуток времени для всех идентификаторов вызовов для каждого идентификатора на основе даты предыдущего вызова (starttime). Например, мне нужно время для всех вызовов для идентификатора 1 (CallID 67 — CallID 56 и CallID 70 — CallID 67 и т.д.).

Я знаю, что мне нужен какой-то цикл, который просматривал бы идентификаторы, чтобы найти идентификаторы вызовов для этого идентификатора, но нужна ли мне также временная таблица, в которой я бы упорядочивал идентификаторы вызовов?

Любые предложения будут оценены. Спасибо.

Комментарии:

1. Можете ли вы предоставить желаемый результат для идентификаторов 1 и 2 в табличном формате?

Ответ №1:

Один из способов.

 ;WITH T
     AS (SELECT ID,
                CallID,
                Starttime,
                ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Starttime) RN
         FROM   YourTable)
SELECT t1.ID,
       t1.CallID,
       t2.CallID,
       DATEDIFF(HOUR, t1.Starttime, t2.Starttime)
FROM   T t1
       INNER JOIN T t2
         ON t1.RN = t2.RN - 1
            AND t1.ID = t2.ID  
  

Комментарии:

1. Это выглядит великолепно, хотя я не могу запустить его (все еще учусь!) по какой-то причине… Я продолжу пытаться запустить его и проверить этот ответ. Также спасибо за редактирование для меня!

2. Я наконец-то заставил это работать, и это прекрасно. Большое вам спасибо!