Question

Problème:

J'ai une base de données de lectures de capteurs avec un horodatage pour le moment a été lu le capteur. Fondamentalement, il ressemble à ceci:

Sensor | Timestamp | Value

Maintenant, je veux faire un graphique de ces données et je veux faire plusieurs graphiques différents. Disons que je veux un pour le dernier jour, un pour la dernière semaine et un pour le dernier mois. La résolution de chaque graphique sera différent si le graphe de jour, la résolution de 1 minute. Pour le graphique de la semaine, il serait une heure pour le graphique de mois, il serait un jour, ou quart de jour.

Je voudrais donc une sortie qui est la moyenne de chaque résolution (par exemple. Jour = moyenne sur la minute, Semaine = moyenne sur l'heure et ainsi de suite)

Ex:

Sensor | Start | End | Average

Comment puis-je faire facilement et rapidement mySQL? Je soupçonne que invoves création d'une table temporaire ou trie et joindre les données du capteur avec qui pour obtenir les valeurs moyennes du capteur? Mais ma connaissance de mySQL est limitée au mieux.

est-il un moyen très intelligent de le faire?

Était-ce utile?

La solution

SELECT  DAY(Timestamp), HOUR(Timestamp), MINUTE(Timestamp), AVG(value)
FROM    mytable
GROUP BY
        DAY(Timestamp), HOUR(Timestamp), MINUTE(Timestamp) WITH ROLLUP

clause de WITH ROLLUP ici produit des lignes supplémentaires avec des moyennes pour chaque HOUR et DAY, comme ceci:

SELECT  DAY(ts), HOUR(ts), MINUTE(ts), COUNT(*)
FROM    (
        SELECT  CAST('2009-06-02 20:00:00' AS DATETIME) AS ts
        UNION ALL
        SELECT  CAST('2009-06-02 20:30:00' AS DATETIME) AS ts
        UNION ALL
        SELECT  CAST('2009-06-02 21:30:00' AS DATETIME) AS ts
        UNION ALL
        SELECT  CAST('2009-06-03 21:30:00' AS DATETIME) AS ts
        ) q
GROUP BY
        DAY(ts), HOUR(ts), MINUTE(ts) WITH ROLLUP
2, 20, 0, 1
2, 20, 30, 1
2, 20, NULL, 2
2, 21, 30, 1
2, 21, NULL, 1
2, NULL, NULL, 3
3, 21, 30, 1
3, 21, NULL, 1
3, NULL, NULL, 1
NULL, NULL, NULL, 4

2, 20, NULL, 2 signifie ici que COUNT(*) est 2 pour DAY = 2, HOUR = 20 et toutes les minutes.

Autres conseils

Pas tout à fait le tableau de résultat que vous vouliez, mais voici une entrée pour faire une résolution de 1 minute:

SELECT sensor,minute(timestamp),avg(value) 
FROM table 
WHERE <time period specifier limits to a single hour>
GROUP BY sensor, minute(timestamp)

Je suis code utilisé très similaire à celui (non testé, mais il prend du code de travail)

définir les variables:

$seconds = 3600;
$start = mktime(...);  // say 2 hrs ago
$end   = .... // 1 hour after $start

puis exécutez la requête

SELECT MAX(`when`) AS top_When, MIN(`when`) AS low_When,
   ROUND(AVG(sensor)) AS Avg_S,
   (MAX(`when`) - MIN(`when`)) AS dur, /* the duration in seconds of the actual period */
   ((floor(UNIX_TIMESTAMP(`when`) / $seconds)) * $seconds) as Epoch
   FROM `sensor_stats`
   WHERE `when` >= '$start' AND `when` <= '$end' and duration=30
   GROUP BY Epoch/*((floor(UNIX_TIMESTAMP(`when`) / $seconds)) * $seconds)*/

L'avantage de ceci est que vous pouvez avoir tout le temps des périodes que vous voulez -. Et même pas nécessaire de les avoir sur les « chiffres ronds », comme une heure d'horloge complète (même une horloge minute, 0-59)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top