2009-09-15 12 views
1

Je ne suis pas sûr que cela soit possible dans une seule requête, mais j'essaie d'obtenir ce qui suit avec MySQL et je n'ai pas encore trouvé de solution.Combiner SUM et AVG avec GROUP BY dans MySQL

J'ai une table qui est structuré un peu comme ceci:

ID  LOG_VALUE LOG_TIME  

1  5000  19:05:42 
    2  6205  19:05:45 
    3  1000  19:05:40 
    1  5000  19:05:52  
    2  6403  19:05:55 
    3  1500  19:05:50 
    1  5000  19:06:02  
    2  6403  19:06:05 
    3  1500  19:06:00 

Les lignes sont insérées dans ce tableau de journal à intervalles réguliers à savoir toutes les 10 secondes. Je voudrais interroger les enregistrements pour calculer une valeur log_logue moyenne combinée pour chaque minute. Le problème que j'ai, c'est que je ne suis pas sûr de savoir comment calculer une moyenne par ID pour chaque minute, avec la somme des moyennes pour une minute donnée, seulement l'une ou l'autre.

En termes de base que je suis désireux de réaliser ce processus:

  • Trouver la moyenne de tous les journaux pour ID 1 à 19:05
  • Trouvez la moyenne de tous les journaux pour ID 2 à 19h05
  • Trouvez la moyenne de tous les journaux pour ID 3 19:05
  • Ajouter les moyennes ensemble pour donner un total de 19:05
  • Faites la même chose pour 19h06

Le SQL ci-dessous ne fait pas ce que je veux mais je l'ai inclus pour aider à supporter le problème.

SELECT ROUND(AVG(log_value)) AS average_value, EXTRACT(HOUR_MINUTE FROM log_time) 
FROM (`logs`) 
GROUP BY MINUTE(log_time), id 
ORDER BY log_time DESC 

Merci pour toute aide que vous pouvez fournir.

+0

Ceci est une requête facile, voudrais avoir MySQL ici pour tester vite fait, il devrait être quelque chose comme: id select, heure + ':' + minute, avg (log_value) de journaux groupe par id, heure + » : '+ minute – BlackTigerX

Répondre

1

Essayez de suivre

SELECT 
    ROUND(AVG(log_value)) AS average_value, 
    EXTRACT(HOUR_MINUTE FROM log_time), 
    id 
FROM (`logs`) 
GROUP BY 
    EXTRACT(HOUR_MINUTE FROM log_time), id 
ORDER BY 
    log_time DESC 
+0

Vous pouvez supprimer id de groupe par et sélectionnez pour obtenir toutes les moyennes minutes, si vous avez besoin tous dans une requête utilisation union –

+0

Donc, vous suggérez le faire en dehors de l'instruction SQL pour combiner les moyennes? – MSR

+0

Si vous allez les lister dans une liste différente, il n'est pas nécessaire de les écrire dans la même requête, après tout la moyenne générale n'a pas du tout le champ id. Cependant, si vous voulez tout en une requête, vous pouvez utiliser la requête donnée par najmeddine. –

0
SELECT id, 
     EXTRACT(HOUR_MINUTE FROM log_time), 
     ROUND(AVG(log_value)) AS average_value 
    FROM (`logs`) 
GROUP BY EXTRACT(HOUR_MINUTE FROM log_time), id 
UNION ALL 
SELECT null id, 
     EXTRACT(HOUR_MINUTE FROM log_time), 
     ROUND(AVG(log_value)) AS average_value 
    FROM (`logs`) 
GROUP BY EXTRACT(HOUR_MINUTE FROM log_time) 
ORDER BY EXTRACT(HOUR_MINUTE FROM log_time) 

le premier moyen de calcul de requête sur Id distincte, HOUR_MINUTE.
la deuxième requête calcule la moyenne sur distinct HOUR_MINUTE = somme de chaque moyenne d'ID pour ce HOUR_MINUTE

(id = null pour faire l'UNION).