2013-09-04 2 views
1

내 데이터베이스에 테이블이 있습니다. 내 프로그램은 매 10 분마다 해당 테이블에 데이터를 삽입합니다.DB, 시간 및 특정 간격을 기준으로 데이터를 선택하는 방법

표에는 삽입 날짜와 시간을 기록하는 필드가 있습니다.

이제 데이터를 가져오고 싶지만 수백 가지 데이터가 나오기를 원하지 않습니다.

삽입 시간 스탬프를 기준으로 매 30 분마다 한 레코드를 가져오고 싶습니다 (따라서 총 시간은 하루에 50 개 미만).

해당 1 개의 레코드의 경우, 임의의 선택 또는 각 간격의 평균 일 수 있습니다.

하자 말 간격으로 선택하는 방법 알아 난 그냥 싶어 그림 사촌의 ambiguit 죄송 ,

Table name: network_speed 
---------------------------------- 

ID. ....... Speed .........  Insert_time 

1 ....... 10 .........   10:02am...... 
2 ....... 12 .........   10:12am...... 
... 
... 
... 
123 ....... 17  ........  9:23am........ 

그들을 제외한 모든 풋에서 각 반 시간 레코드의 평균해야합니다 얻으려면

이것을 달성하기 위해 어떻게 쿼리를 작성할 수 있습니까?

+0

1 또는 2 개의 레코드 ... 임의로 임의로 선택 하시겠습니까? 시간의 끝까지 가장 가깝습니까? 시간의 톱? 이것은 명확하지 않다. – ChicagoRedSox

+0

ChicagoRedSox : 혼란을 가져서 죄송합니다. 매 30 분마다 1을 말하십시오. –

+0

어떤 RDBMS가 이것을위한 것입니까? –

답변

1

1 개 행을 취득하는 것은 특정 일에 반 시간 간격을 계산하는 쿼리입니다 (2013-09-04).

SELECT ID, Speed, Insert_time, 
ROUND(TIMESTAMPDIFF(MINUTE, '2013-09-04', Insert_time)/48) AS 'interval' 
FROM network_speed 
WHERE DATE(Insert_time) = '2013-09-04'; 

간격의 레코드에 대한 통계를 얻기 위해 중첩 된 쿼리에서이를 사용하십시오.

SELECT IT.interval, COUNT(ID), MIN(Insert_time), MAX(Insert_time), AVG(Speed) 
FROM 
    (SELECT ID, Speed, Insert_time, 
    ROUND(TIMESTAMPDIFF(MINUTE, '2013-09-04', Insert_time)/48) AS 'interval' 
    FROM network_speed 
    WHERE DATE(Insert_time) = '2013-09-04') AS IT 
GROUP BY IT.interval; 

여기에서 각 간격의 첫 번째 레코드를 가져 오는 데 사용됩니다.

SELECT NS.* 
FROM 
    (SELECT IT.interval, MIN(ID) AS 'first_id' 
    FROM 
     (SELECT ID, Speed, Insert_time, 
     ROUND(TIMESTAMPDIFF(MINUTE, '2013-09-04', Insert_time)/48) AS 'interval' 
     FROM network_speed 
     WHERE DATE(Insert_time) = '2013-09-04') AS IT 
    GROUP BY IT.interval) AS MI, 
    network_speed AS NS 
WHERE MI.first_id = NS.ID; 

희망이 있습니다.

+0

정말 도움이됩니다. 정말 고마워요. –

0

이것이 필요한가요?

SELECT HOUR(ts) as hr, fld1, fld2 from tbl group by hr 

이 쿼리는 타임 스탬프에서만 시간을 선택하고 시간 필드를 기준으로 다음 그룹 결과는 그래서 당신은 각 시간 여기

관련 문제