J'ai la requête suivante:SQL en moyenne plusieurs périodes du même ensemble de données
SELECT AVG(val) from floatTable
WHERE tagindex IN(1,2,3,4)
AND DateAndTime > '$first_of_year'
Il retourne la valeur moyenne de toutes les valeurs mesurées pour les quatre balises pour l'année à ce jour. Puisque je récupère déjà ces données, comment puis-je obtenir les données depuis le premier jour du mois, depuis le début de la semaine et depuis minuit? J'ai déjà ces dates calculées comme $ first_of_month, $ first_of_week et $ minuit. J'essaie de minimiser la requête et j'espérais que quelqu'un pourrait m'aider à créer de la magie SQL pour retourner ces données dans une seule requête ou un ensemble optimisé de requêtes. Cette requête prend en moyenne 300 secondes, donc je veux le faire le moins possible.
Merci d'avance.
Si vous ne voulez pas faire trop d'allers-retours à la base de données, vous pouvez simplement mettre ces moyennes dans les sous-requêtes dans une requête énorme. En ce qui concerne ma majeure en mathématiques, il me dit que les moyennes ne peuvent pas être divisées ou combinées, donc vous devez vraiment les calculer à nouveau sur différentes périodes de temps. –
@Denis, voir la réponse de RedFilter. Les sous-requêtes ne nécessiteraient pas de déplacements supplémentaires dans la base de données, mais * nécessiteraient des lectures logiques supplémentaires au sein de la requête, de sorte que le temps global de la requête pourrait être jusqu'à quatre fois plus long. En ce qui concerne les moyennes, la plupart des versions de SQL omettent complètement les valeurs NULL des calculs agrégés - donc les quatre expressions différentes dans la requête de RedFilter seraient calculées correctement (car les valeurs qui ne satisfont pas les conditions seraient évaluées comme NULL). –
@Mark Bannister, j'ai silencieusement admis mon faux pas au moment RedFilter posté sa réponse et immédiatement appris de lui et je voulais laisser mon commentaire pour la postérité pour apprendre de mon hypothèse rapide. –