2013-08-16 2 views
0
EquipmentUseId CollectionPointId EmployeeNum ShopOrder StartDateTime 
366     69    9999   999999  4/26/13 3:29 PM 
373     69    4878   107321  4/26/13 10:19 PM 
385     69    4971   107321  4/27/13 7:35 AM 
393     69    4179   107325  4/30/13 7:24 AM 
394     69    4179   107325  4/30/13 7:38 AM 
395     69    4179   107325  4/30/13 10:28 AM 
398     69    4179   107325  4/30/13 2:41 PM 
399     69    9999   999999  4/30/13 2:43 PM 
400     69    9999   999999  4/30/13 2:46 PM 

Учитывая приведенную выше таблицу, у меня осталась уникальная проблема, и ее описание может быть столь же сложным. Для каждого ShopOrder для каждого сотрудника есть StartDateTime, но нет StopDateTime, это по дизайну. Однако мне нужно рассчитать разницу во времени между StartDateTime одного ShopOrder и StartDateTime следующего ShopOrder. Пример: SO # 999999 начинается с 15:29 по 4/26 Employee 9999, затем новый SO # 107321 запускается в 22:19 4/26 сотрудниками 4878. Мне нужно будет вычислить разницу между 4/26/2013 22:19 и 26.04.2013 15:29. Это дало бы мне дату выхода для SO # 9999, но на самом деле это необходимо для вторичного процесса. Пока я просто должен быть в состоянии получить время. Одно отключение происходит, если SO # совпадают, тогда я бы использовал только первый StartDateTime и первый StartDateTime следующего SO #. Извините, это так долго, я даже не уверен, что я объяснил что-нибудь в этот момент.Расчет разницы во времени из нескольких строк

Прошу вас, пожалуйста, на меня ... это был долгий день.

Отредактировано для вывода на 08/19/2013:

После обдумывал его на во время уик-энда, я решил, что будет лучше использовать EndDateTime, как этот запрос только первый шаг в общее приложение/отчет.

Кроме того, EmployeeNum больше не относится к этой части приложения.

Вот как это должно выглядеть (EquipmentUseID PK, CollectionPointID всегда 69, поэтому их не нужно отображать на выходе )?

ShopOrder StartDateTime  EndDateTime 
999999  4/26/13 3:29 PM  4/26/13 10:19 PM 
107321  4/26/13 10:19 PM  4/30/13 7:24 AM 
107325  4/30/13 7:24 AM  4/30/13 2:43 PM 
999999  4/30/13 2:43 PM  <next SO# StartDateTime> 

Резюмируя эту таблицу, я нужен SO #, в StartDateTime за SO # (уже в таблице), и в EndDateTime, которая является на самом деле StartDateTime для следующего ТАК#. Надеюсь, это очистит , извините за путаницу.

+0

использовать вложенное представление, где вы впервые получить максимальную дату каждого заказа магазина, а затем посмотреть на себя функции LAG и петлю на тех, кто делает время дифф – Randy

+0

@randy Нет лаг в SQL 2005 – Paparazzi

+0

@ ctmcklowe96 Вы могли бы предоставить желаемый результат для данного ввода? –

ответ

0
with orderedTickets as 
(
    select ShopOrder, min(StartDateTime) as date 
     , row_number() over (order by min(StartDateTime)) as rownumber 
    from table 
    where ShopOrder is not null 
    group by ShopOrder 
) 
select t1.ShopOrder, datediff(ss, t1.StartDateTime, t2.StartDateTime) 
    from orderedTickets as t1 
    join orderedTickets as t2 
    on t2.rownumber = t1.rownumber + 1 
+0

Спасибо Блэм, это сделал трюк. – ctmcklowe96

0

Это решение первой проблемы, которая получает следующее время в «следующем» порядке магазина. Это решение использует коррелированный подзапрос:

select t.*, nextStartDateTime - StartDateTime -- or use datediff() here if you want the time in particular units 
from (select t.*, 
      (select top 1 StartDateTime 
       from t t2 
       where t2.StartDateTime > t.StartDateTime and 
        t2.ShopOrder <> t.ShopOrder 
       order by StartDateTime 
      ) as nextStartDateTime 
     from t 
    ) t; 

Вторая проблема заключается в получении первой записи для данного заказа магазина. Я не уверен, что полностью понимаю это. Это поможет, если вы отредактировали вопрос, чтобы объяснить результаты, которые вы хотите, по данным, предоставленным в вопросе.

0

Использование CTE, -

;with Equipment as 
(
select EquipmentUseId, CollectionPointId, EmployeeNum, ShopOrder, StartDateTime, row_number() over (PARTITION BY ShopOrder order by EquipmentUseId) as rownumber 
from your_table 
), 
Equipment2 AS (
select EquipmentUseId, CollectionPointId, EmployeeNum, ShopOrder, StartDateTime, row_number() over (order by EquipmentUseId) as rownumber 
from Equipment WHERE rownumber = 1 
) 

SELECT t1.EquipmentUseId, 
    t1.CollectionPointId, 
    t1.EmployeeNum, 
    t1.ShopOrder, 
    t1.StartDateTime, 
    CONVERT(VARCHAR, DATEDIFF(n, t1.StartDateTime, t2.StartDateTime)/60) + ':' + RIGHT('0' + CONVERT(VARCHAR,(DATEDIFF(n, t1.StartDateTime, t2.StartDateTime)%60)), 2) time_diff 
FROM Equipment2 AS t1 
LEFT JOIN Equipment2 AS t2 ON t2.rownumber = t1.rownumber + 1