2013-05-01 2 views
4

내 프로젝트에서 시간 범위를 계산해야합니다. 현재, 내 쿼리와 일치하는 모든 TimeStamp를 가져와 List<>에 저장하고 있습니다. 그런 다음 목록을 반복하여 간격이 10 초 이하인지 확인한 다음 함께 추가합니다. 10 초를 초과하는 것은 무시됩니다. 저를 위해 할 수있는 SQL 쿼리가 있다면 궁금합니다. 나는 약간의 검색을했지만 아무 것도 찾지 못했습니다. 본질적으로, 나는 그렇게 할 필요가 없다면 너무 많은 정보를 메모리에 저장할 필요가 없다. 여기 내 List<>을 통해 내가 반복 사용하고 방법은 다음과 같습니다타임 스탬프를 기반으로 시간 범위를 계산하는 SQL 쿼리

private static TimeSpan TimeCalculations(IList<DateTime> timeStamps) 
{ 
    var interval = new TimeSpan(0, 0, 10); 
    var totalTime = new TimeSpan(); 

    for (var j = 0; j < timeStamps.Count - 1; j++) 
    { 
     if (timeStamps[j + 1].Subtract(timeStamps[j]) > interval) continue; 
     var timeDifference = timeStamps[j + 1].Subtract(timeStamps[j]); 
     totalTime = totalTime.Add(timeDifference); 
    } 

    return totalTime; 
} 

현재 검색되는 데이터의 가치가 10 400K에 행 어디서나 할 수있는 데이터입니다. 다음은 샘플입니다.

2006-09-07 11:46:09 
2006-09-07 11:46:19 - 10 seconds 
2006-09-07 11:46:20 - 1 second 
2006-09-07 11:46:36 

2006-09-07 11:47:49 
2006-09-07 11:47:53 - 4 seconds 
2006-09-07 11:48:02 - 9 seconds 
2006-09-07 11:48:15 
2006-09-07 11:48:29 
2006-09-07 11:48:34 - 5 seconds 

2006-09-07 11:54:29 
2006-09-07 11:54:39 - 10 seconds 
2006-09-07 11:54:49 - 10 seconds 
2006-09-07 11:54:59 - 10 seconds 

약 59 초가 소요됩니다. 이것은 제가 찾고있는 결과입니다.

사용중인 데이터베이스가 SQLite입니다. 답변을 보면

편집

, 내 질문은 충분히 아주 철저한 아니라는 것을 알 수 있습니다. TimeStamps를 가져 오기위한 현재 쿼리만으로 충분합니다. 내가 뭘 찾고있는 쿼리 간격을 10 초 이하의 경우 그들 사이의 차이를 함께 추가 할 수 있습니다.

+0

데이터베이스에서 작업하려는 데이터에 대해 더 자세히 설명해 줄 수 있습니까? 테이블 구조, 샘플 데이터, 샘플 데이터에서 원하는 결과가 좋은 시작이 될 것입니다 ... –

+0

흠, 당신은 linq 라이브러리를 사용할 수 있습니까? – Nomad101

+0

@ Nomad101 예, 할 수 있습니다. – MyCodeSucks

답변

3

sqlfiddle를 만들려면 샘플 데이터를 사용하고이 쿼리는 샘플 데이터에 대해 작동합니다

SELECT DISTINCT tbl.timestamp FROM main_tbl tbl 
INNER JOIN 
(
SELECT temp.ID, temp.timestamp FROM main_tbl temp 
)test 
ON tbl.timestamp <= datetime(test.timestamp, '+10 seconds') 
AND tbl.timestamp >= datetime(test.timestamp, '-10 seconds') 
AND tbl.ID <> test.ID 
ORDER BY tbl.timestamp 

http://sqlfiddle.com/#!7/049f5/3

편집 2 : 내가 연주

SELECT 
sum(
    strftime('%s', 
    (
    SELECT min(temp.timestamp) 
     FROM main_tbl temp 
     WHERE temp.timestamp > tbl.timestamp 
    ) 
) - strftime('%s',tbl.timestamp) 
) as total_sum 
FROM main_tbl tbl 
WHERE (
    strftime('%s', 
    (
     SELECT min(temp.timestamp) 
     FROM main_tbl temp 
     WHERE temp.timestamp > tbl.timestamp 
    ) 
) - strftime('%s',tbl.timestamp) 
) <= 10 
AND date = "2013-05-13" 
AND col1 = col2 

http://sqlfiddle.com/#!7/049f5/55

+0

차이점이 함께 추가됩니까? – MyCodeSucks

+0

두 번째 편집을 정말 파고 있습니다. 내 유일한 질문은 이제 쿼리에 대한 추가 요구 사항을 어디에 넣을 것입니까? 지금 내 쿼리는'SELECT timestamp FROM table WHERE date = "2013-05-13"AND col1 = col2;'입니다. – MyCodeSucks

+0

'<= 10' 부분 다음에 추가합니다. – SOfanatic

3

int col을 가진 간단한 테이블로 s t1과 t2를 비교하고이 쿼리에서 올바른 결과를 얻었습니다. 필요한대로 끝에서 두 번째 줄을 수정하십시오!

SELECT sum(diff) FROM ( 
SELECT t_1.rowid AS this_id, other_t1 - t_1.t1 as diff 
FROM temp AS t_1 
JOIN 
(SELECT t_2.t1 AS other_t1, t_2.rowid AS other_id 
    FROM temp t_2 ) 
ON this_id = other_id-1 
WHERE other_t1 - t_1.t1 = 1 
); 

3 중첩 선택입니다. 바깥 쪽은 찾은 모든 차이점을 합한 것입니다. 처음과 마지막 줄에 불과합니다. 두 번째 레벨 - 두 번째 라인에서 - 대부분의 작업을 수행합니다. inner select는 두 번째 레벨의 테이블 행 및 타임 스탬프 값 목록을 제공합니다.

이 조치는 다음으로 높은 행과 1이 다른 "t1"이있는 모든 행의 차이를 합하는 것입니다.

차이점을 확인하려면 첫 번째 줄과 마지막 줄을 생략하고 ";"

... 깜빡 했군. t1은 타임 스탬프였습니다. t2는 "다른 데이터"를 나타냅니다.

관련 문제