2010-03-09 5 views
0

각 항목에 시간 소인이 연결된 표가 있습니다. 어떤 연속 된 항목 쌍 사이에서 가장 큰 간격을 찾고 싶습니다. 쿼리만으로 가능합니까?날짜 목록 간의 가장 큰 시간 간격 찾기


업데이트 : 내가 좀 덜 혼란스럽게 만들 수 있는지 보도록하겠습니다. 내가하고 싶은 일은 각 항목의 타임 스탬프와 그 전후의 항목을 비교하여 두 시간 사이에 경과 한 시간을 확인하는 것입니다. 모든 항목에 대해 그렇게하고 싶습니다. 결국에는 두 항목간에 가장 큰 차이가 있습니다.

분명히 첫 번째 항목과 마지막 항목이기 때문에 두 항목 간의 가장 큰 차이점을 원하지 않습니다. 바라기를 그 설명이 더 명확하다.


UPDATE2 : 답변을 수락 한 후 너무 빨리 문제를 잘못 설명했습니다. 새로운 문제는 항목 ID가 타임 스탬프와 동일한 순서가 아니라는 것입니다. 나는 일부 데이터 문제를 설명하려고거야

는 ... 위의 항목에 대한 그래서

 
Item - Time (seconds) 
Item0 - 000 
Item1 - 030 
Item2 - 120 
Item3 - 090 
Item4 - 100 

, 나는 (항목 1 사이 3) 60 초 원하지만 마틴의 (큰) 대답은 것 90 초 반환 (항목 1 및 2)

+2

질문을 명확히 할 필요가 있다고 생각합니다. 한 가지 방법으로 읽으면 두 날짜의 차이를 찾아야하는 것처럼 들리지만 이는 뺄셈입니다. 어쩌면 날짜 세트에서 MAX와 MIN 날짜를 찾고 싶습니까? – jcollum

답변

2

이 방법이 유용할까요?

select max(timestamp_field)-min(timestamp_field) from my_table; 
+0

좀 더 명확하게 질문을 업데이트했습니다. 이건 내가 찾고 있던 것이 아니지만 고마워. – UmYeah

3

가정 테이블처럼 :

create table item (i int not null primary key, 
        t datetime not null); 

select i1.i, i2.i, 
     abs(unix_timestamp(i1.t) - unix_timestamp(i2.t)) diff 
from item i1 
join item i2 on i1.i+1 = i2.i 
order by diff desc 
limit 1; 

이 행이 다음 행과 결합되는 곳에는 자체 조인입니다. diff 값은 내림차순 값 (가장 큰 것부터)으로 인쇄되고 첫 번째 행만 출력됩니다.

편집 : 질문의 설명에 따라 내 솔루션을 구제하기위한 약한 시도가 있습니다.

이 순위를 나타내는 AUTO_INCREMENT 값이 할당 항목 날짜 순서와 임시 테이블을 만든 다음 임시 테이블에 자체 조인 적용

create temporary table ranked_item (rank int not null auto_increment primary key, 
        i int not null, 
        t datetime not null); 

insert into ranked_item 
     select null, i, t from item order by t asc; 

select i1.rank, i2.rank, i1.i, i2.i, 
     abs(unix_timestamp(i1.t) - unix_timestamp(i2.t)) diff 
from ranked_item i1 
join ranked_item i2 on i1.rank+1 = i2.rank 
order by diff desc 
limit 1; 

물론, 당신의 품목 테이블이 큰 경우,이 조금 사치 스럽다.

0

질문에 표 이름을 나열하지 않았으므로 해결책을 찾기 위해 times_logged_in.log_in을 작성했습니다. 또한, 나는 MySQL을 설치하지 않았기 때문에 MS SQL Server에서이 작업을 시도했지만 아주 가깝습니다.

select top 1 
    tli2.log_in as log_in, 
    tli2.previous as previous, 
    tli2.log_in - tli2.previous as time_span 
from 
    (
     select 
      tli.log_in as log_in, 
       (select max(log_in) from times_logged_in p where p.log_in < tli.log_in) as previous 
     from 
      times_logged_in tli 
    ) tli2 
order by time_span desc 

그냥 다음과 같이이 작업을 수행 명확히하기 :

먼저 우리가 (ID 또는 무엇이든 추천하고 우리가 출력 할 다른 열) 모든 시간을 선택합니다. 위의 두 번째 SELECT입니다.

그런 다음 이전 시간의 열을 추가합니다. 이는 상관 된 부속 조회를 사용하여 판별됩니다. 위의 세 번째 SELECT입니다.

그런 다음 쿼리에서 반환 된 시간과 이전 시간 사이의 시간 간격을 계산합니다. 우리는 다른 쿼리에서 모든 것을 래핑하여이 작업을 수행합니다. 위의 첫 번째 SELECT입니다.그래서 지금 우리는 우리가 원했던 열이 무엇이든지 이전 시간과 그들 사이의 시간 간격을 더했습니다. 그래서 우리는 timespan 길이만큼 내림차순으로 행을 정렬하고 첫 번째 행을 취하면 완료됩니다!