2017-01-26 1 views
-1

시간 범위로 행 간의 필드의 MAX를 함유 SELECT 행 :MySQL은 : 겹치는 시간

+-----+-------+-------+-------------+ 
| ID | start | stop | value  | 
+-----+-------+-------+-------------+ 
| 1 | 1:00 | 3:00 |  6  | 
| 2 | 5:00 | 9:00 |  3  | 
| 3 | 6:00 | 10:00 |  1  | 
+-----+-------+-------+-------------+ 

이 내 원하는 출력 : 경우

+-----+-------+-------+-------------+ 
| ID | start | stop | value  | 
+-----+-------+-------+-------------+ 
| 1 | 1:00 | 3:00 |  6  | 
| 2 | 5:00 | 9:00 |  3  | 
+-----+-------+-------+-------------+ 

시작하고 (타임 스탬프 중첩 정지 행 2 & 3)에서 볼 수 있듯이 MAX()value 인 행을 원합니다.

sort(timespans) // by 'value', highest first 

results = [] 
for (t in timespans) 
    for (row in results) 

     overlap = 
       (row.start < t.start && t.start < row.stop) // t.start within row 
      || (row.start < t.stop && t.stop < row.stop) // t.stop within row 
      || (t.start < row.start && row.stop < t.stop) // t encapsulates row 

     if (!overlap) 
      results.push(t) 
+0

나는이 데이터 세트가 문제를 제대로 대표 확신 아니에요. http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query를 참조하십시오. – Strawberry

+0

기간이 겹치는 두 개의 행에 '값'이 같은 경우 어떻게해야합니까? –

+0

'value'는 실제로 내 실제 문제의 삽입 타임 스탬프입니다. 이것은 결코 일어나서는 안됩니다. – thedarklord47

답변

1

EXISTS을 사용하면 start/stop 값이 중복되고 다른 값이 value 인 다른 행이 있는지 확인할 수 있습니다. 이 같은

뭔가 :

select t1.id, t1.start, t1.stop, t1.value 
from your_table t1 
where not exists (
    select NULL 
    from your_table t2 
    where ((t2.start between t1.start and t1.stop) or (t2.stop between t1.start and t1.stop)) 
    and t2.value > t1.value 
) 
-1

를 지금까지 내가 여기에 내가 아마에 IF() 문을 사용 제한된 정보에서 말할 수 있습니다 : 그것은 명확히하는 데 도움이 경우

, 여기에 하나를 프로그래밍 방식으로이 문제를 해결하기 위해 취할 수있는 방법입니다 겹치기를 찾고 에 레코드를 병합하십시오. table_Name에서 SELECT *를 호출하여 assock에 저장하십시오. 그런 다음 레코드에 루프를 실행하십시오. < time_b 그래서 time_a는 레코드 1에서 중지하십시오 time_b = 레코드 2를 시작하는 것입니다. 어쩌면 IF() 루프가 아닌 중괄호에서 정보를 복사 할 수 있습니다. d 1 및 레코드 2 시작하고 레코드 1에서 시작하고 레코드 2에서 중지하는 하나의 레코드를 만듭니다. assoc에서 2 레코드를 삭제하고 반짝 이는 새 레코드로 바꾼 다음 SQL INSERT INTO를 사용하여 전체 테이블을 다시 정의하십시오.

나는 그것이 내가 당신의 사과를 얻기 위해 노력하는 것을 이해하지 못한다면 당신이 원하는 것을 생각합니다.