2014-05-10 5 views
0

가 하나가 "시작 시간"과 "종료 시간"과 아래의 요청어떻게 중복 시간 항목을 찾을 수와 지속 시간을 복제하는 방법 -

내가 시간 항목의 목록을 가지고 나를 도울 수있는 SQL. 그러나 경우에 따라 항목의 종료 시간이 동일하고 경우에 따라 항목이 동일한 시간대에 속하게됩니다.

시간 항목에서 기간이 필요하지만 중복 시간 입력 기간없이 반영해야하는 기간이 필요합니다. 다른 시작 시간과 종료 시간이 많은 항목이 있더라도 하나의 시간 기간이 필요합니다.

아래를 참조하십시오.

시나리오 1 :

ID Log No Start time  End time 
5 1001 4/6/2014 6:34 4/6/2014 7:47 
5 1001 4/6/2014 0:34 4/6/2014 0:47 
5 1002 4/6/2014 0:09 4/6/2014 0:47 
5 1000 4/5/2014 23:36 4/6/2014 0:47 
5 1000 4/5/2014 23:16 4/6/2014 0:47 
5 1008 4/5/2014 22:50 4/6/2014 0:47 
5 1006 4/5/2014 22:41 4/6/2014 0:47 
5 1010 4/5/2014 22:26 4/6/2014 0:47 
5 1008 4/5/2014 22:50 4/6/2014 0:47 
5 1006 4/5/2014 22:41 4/6/2014 0:47 
5 1008 4/5/2014 22:26 4/6/2014 0:47 
5 1003 4/5/2014 22:13 4/6/2014 0:47 
5 1005 4/5/2014 22:01 4/6/2014 0:47 
5 1010 4/5/2014 21:48 4/6/2014 0:47 
5 1010 4/5/2014 17:48 4/5/2014 21:47 

최종 결과 : (그들은 같은 기간에 가을만큼이 시간 항목의 기간). Log No는 결과/출력에서 ​​무시할 수 있습니다. 기본적으로 Log no는 중요하지 않습니다. 그것은 내가 얻으려고하는 기간입니다.

5 1001 4/6/2014 6:34 4/6/2014 7:47 1.22 
5 1010 4/5/2014 21:48 4/6/2014 0:47 2.97 
5 1010 4/5/2014 17:48 4/5/2014 21:47 3.97 

시나리오 2 :

5 1002 4/4/2014 12:38 4/4/2014 15:45 
5 1002 4/4/2014 7:47 4/4/2014 8:45 
5 1000 4/4/2014 7:17 4/4/2014 7:20 
5 1008 4/4/2014 7:15 4/4/2014 7:45 
5 1003 4/4/2014 7:08 4/4/2014 7:28 
5 1005 4/4/2014 7:05 4/4/2014 10:08 
5 1005 4/4/2014 5:08 4/4/2014 8:06 

최종 결과 :

5 1002 4/4/2014 12:38 4/4/2014 15:45 3.12 
5 1005 4/4/2014 7:05 4/4/2014 10:08 3.06 
5 1005 4/4/2014 5:08 4/4/2014 8:06 2.98 

주의 사항은, 모두 시나리오는 하나 개의 데이터 세트에 가능하다. 도와주세요.

감사합니다.

답변

0

"겹치는 간격을 병합"하면됩니다. Google로 검색하면 많은 답변을 찾을 수 있습니다.

:

항목 목록 배열 a에있는 생성 된 목록 배열 ba 항목 수가 될 일이 모두 갖는 길이> = n로 가정하고, 다음을 수행 할 수 있으며, 상기 그

의사 코드

Sort a by start asc 
i=0 
r=0 
while i<n 
    j = i+1 
    while j <n 
     if a(j).start <= a(i).end 
      a(i).end = max(a(i).end, a(j).end) 
      ++j 
     else 
      exit while 
     endif 
    endwhile 
    b(r)=a(i) 
    ++r 
    i=j 
endwhile 
0

어딘가에 있습니까? 모든 행이 같은 값을 가지기 때문에 조금 단순화하고 ID를 제거했습니다.

with t (log_no, start, end) as ( values (1001 ,timestamp('2014-04-06-06.34.00') , timestamp('2014-04-06-07.47.00')), (1001 ,'2014-04-06-00.34.00', '2014-04-06-00.47.00'), (1002 ,'2014-04-06-00.09.00', '2014-04-06-00.47.00'), (1000 ,'2014-04-05-23.36.00', '2014-04-06-00.47.00'), (1000 ,'2014-04-05-23.16.00', '2014-04-06-00.47.00'), (1008 ,'2014-04-05-22.50.00', '2014-04-06-00.47.00'), (1006 ,'2014-04-05-22.41.00', '2014-04-06-00.47.00'), (1010 ,'2014-04-05-22.26.00', '2014-04-06-00.47.00'), (1008 ,'2014-04-05-22.50.00', '2014-04-06-00.47.00'), (1006 ,'2014-04-05-22.41.00', '2014-04-06-00.47.00'), (1008 ,'2014-04-05-22.26.00', '2014-04-06-00.47.00'), (1003 ,'2014-04-05-22.13.00', '2014-04-06-00.47.00'), (1005 ,'2014-04-05-22.01.00', '2014-04-06-00.47.00'), (1010 ,'2014-04-05-21.48.00', '2014-04-06-00.47.00'), (1010 ,'2014-04-05-17.48.00', '2014-04-05-21.47.00') ) select log_no, min(start), end from ( select log_no, start, min(t1.end) end from t t1 where not exists ( select 1 from t t2 where t1.end <= t2.start and t1.end > t2.end and t1.log_no = t2.log_no and not (t1.start,t1.end) = (t2.start,t2.end) ) group by log_no, start ) as u group by u.log_no, end