2013-09-04 3 views
1

У меня есть таблица в моей базе данных, моя программа будет вставлять данные в эту таблицу каждые 10 минут.DB, как выбрать данные на основе времени и определенного интервала

В таблице указано поле ввода даты и времени.

Теперь я хочу получить эти данные, но я не хочу, чтобы сотни данных выходили.

Я хочу получить 1 учетную запись каждые полчаса на основе штампа времени вставки (так меньше 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: извините за путаницу, позвольте сказать всего 1 за каждые полчаса –

+0

Какие РСУБД это? –

ответ

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 

Этот запрос выбирает только час из метки времени, а затем группы результата на основе часового поля, так что вы получите 1 строку за каждый час

Смежные вопросы