2013-08-16 6 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 

위의 표에서 볼 수 있듯이, 나는 고유 한 문제가 남아 있고 마찬가지로 설명하기가 어려울 수 있습니다. Employee 당 ShopOrder마다 StartDateTime이 있지만 StopDateTime은 없으므로 이것은 의도적으로 설계된 것입니다. 그러나 한 ShopOrder의 StartDateTime과 다음 ShopOrder의 StartDateTime 사이의 시간 차이를 계산할 수 있어야합니다. 예 : SO # 999999가 Employee 9999로 4/26의 15:29에 시작한 다음 Employee 4878에 의해 22:19에 새로운 SO # 107321이 시작됩니다. 4/26의 차이를 계산해야합니다. 26/2013 22:19 및 4/26/2013 15:29. 이렇게하면 SO # 9999에 대한 날짜가 정해지지 만 실제로는 보조 프로세스가 필요합니다. 당분간은 시간을 가질 수 있어야합니다. 하나의 전화 끊기는 SO #가 동일하면 첫 번째 StartDateTime 만 사용하고 다음 SO #의 첫 번째 StartDateTime을 사용합니다. 죄송합니다. 너무 길어서 지금까지 아무 것도 설명하지 못했습니다.여러 행에서 시간의 차이 계산

제발 쉽게 가십시오 ... 긴 하루였습니다.

는 2013년 8월 19일에 출력 편집 : 주말 동안 그것을 넘어서 심사숙고 후

,이 쿼리의 첫 번째 단계로는 EndDateTime를 사용하는 을 가장 좋은 것입니다 결정 전체 응용 프로그램/보고서

또한 EmployeeNum은이 부분의 응용 프로그램과 관련이 없습니다.

이는합니다 ( CollectionPointID 그래서 그들은 출력에 표시 할 필요가 없습니다 항상 69되면, EquipmentUseID는 PK입니다) 보는 방법입니까?

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 #, (테이블에 이미) SO # 당 StartDateTime, 하고 다음의 사실 StartDateTime 인 EndDateTime 필요 그래서#. 바라기를 이것은 그것을 맑게한다, 혼란을 위해 유감스럽게.

+0

는 @randy 없음 지연 – Randy

+0

을 diff를 시간을하고 그 이상 LAG 함수와 루프를 검색 한 후, 먼저 가게 주문 당 최대 날짜를 얻을 인라인 뷰를 사용 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

감사합니다. Blam,이 트릭을했습니다. – 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