2013-10-13 5 views
1

У меня есть база данных MySQL с именем WindData который выглядит следующим образом:Показать средние значения для большого количества данных

  • метка времени
  • температура
  • скорость ветра
  • направлением ветра

добавить новый ряд каждые 2-3 минуты, поэтому в течение года будет много строк.

Теперь я хочу представить данные в виде графика за определенный промежуток времени (4 дня назад, в прошлом месяце, последние 6 месяцев, 2011-2012 ...). Скажите, что я хочу показать, как температура изменилась в течение прошлого года, используя Google Charts, чтобы отобразить это. Затем диаграмма Google имеет максимальный предел количества точек данных, которые вы можете использовать.

Я бы тогда как SQL запрос, где я указать TimeRange (2012-01-01 - 2013-10-10), что дает мне

  • фиксированное число строк (например, 200)
  • Каждая строка содержит среднее и максимальное значение за этот интервал.

ASCII-арт пример:

...............1..............2...............+..............199..............200 

Где . одна строка в моей таблице, а цифры представляют собой средние и MAXVALUE из предыдущих точек.

Некоторые psudocode, которые могли бы показать, что я пытаюсь сделать это:

SELECT AVG(temperature) 
FROM WindData 
WHERE timestamp > 2012-01-01 AND timestamp < 2013-10-10 

Это просто дать мне один результат, где я получаю среднее значение всего TimeRange. Так что, возможно, есть способ создать еще один оператор SQL, который запускает вышеуказанный оператор sql 200 раз с разным временным диапазоном.

SELECT AVG(temperature) 
FROM WindData 
WHERE timestamp > 2012-01-01 AND timestamp < 2013-02-1 

SELECT AVG(temperature) 
FROM WindData 
WHERE timestamp > 2012-02-01 AND timestamp < 2013-03-1 

SELECT AVG(temperature) 
FROM WindData 
WHERE timestamp > 2012-03-01 AND timestamp < 2013-04-1 

SELECT AVG(temperature) 
FROM WindData 
WHERE timestamp > 2012-04-01 AND timestamp < 2013-05-1 

... и так далее.

Если кому-то интересно, я буду использовать помощь здесь, чтобы представить лучшие диаграммы на сайте www.surfvind.se, в котором отображаются данные о погоде от домашней метеостанции.

+2

Можете ли вы рассказать нам, что у вас есть? Расскажите, какие конкретные проблемы вы испытываете. – Jeroen

+0

В настоящее время я использую не очень хорошее решение, что я извлекаю все строки из своего кода C#, и я сам вычисляю все средние значения. :-) Но, очевидно, это не очень хорошо, так как я каждый раз загружаю ALOT из данных SQL. Я также попытался запустить 200 запросов sql с разным диапазоном времени, где я запрашиваю значение AVG, которое я хочу. Но это тоже не похоже на хорошую практику, но, может быть, это лучший способ? – ThomasH

+0

обновленное описание, чтобы лучше объяснить, чего я хочу достичь. – ThomasH

ответ

0

Вы можете получить фиксированное количество строк, используя что-то вроде этого: -

SELECT units.i + tens.i * 10 + hundreds.i AS aNumber 
FROM (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units 
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens 
CROSS JOIN (SELECT 0 AS i UNION SELECT 1) hundreds 

Вы можете использовать что-то вроде этого, чтобы получить различные диапазоны, и присоединиться к нему против вас данные, чтобы получить число значений в пределах каждый диапазон.

EDIT - Для того, чтобы перейти с деталями, которые вы добавили: -

SELECT Sub1.aDate, AVG(temperature) 
FROM 
(
    SELECT DATE_ADD('2012-01-01', INTERVAL units.i + tens.i * 10 + hundreds.i * 100 DAY) AS aDate 
    FROM (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units 
    CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens 
    CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) hundreds 
) Sub1 
LEFT OUTER JOIN 
WindData 
ON Sub1.aDate = DATE(WindData.`timestamp`) 
GROUP BY Sub1.aDate 

Это становится диапазон 1000 дней, начиная с 2012-01-01 (вы можете легко ограничить этот диапазон в подвыборки, если вы хотите) и сопоставить это с временными значениями за день и получить среднюю группу по дате.

+0

Я действительно не знаю, как это поможет мне получить x средних значений. – ThomasH

+0

Вам необходимо сгенерировать диапазон диапазонов. Код, подобный приведенному выше, может дать вам ряд значений (что дает вам от 0 до 199). Обычно я бы использовал что-то вроде этого, чтобы добавить к дате начала несколько дней. Затем сопоставьте это с полями, которые вы хотите проверить. Я постучу что-нибудь, чтобы пойти с подробностями, которые вы добавили со времени первоначального сообщения. – Kickstart

+0

Это неверно. :) sqserver прерывает запрос через 30 секунд загрузки. И я не очень люблю этот подход. Лучше всего было бы, если бы я мог: а) рассчитать количество строк между двумя начальными датами. b) Разделите результат с 'a' на 200, а затем создайте цикл for, который запускает простой select avg (температура) между 200 новыми датами. – ThomasH

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