Débutante Mysql - agréger des données

Fermé
cerizee Messages postés 2 Date d'inscription vendredi 23 janvier 2015 Statut Membre Dernière intervention 23 janvier 2015 - 23 janv. 2015 à 12:59
flokocha Messages postés 1510 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 10 octobre 2015 - 23 janv. 2015 à 14:36
Bonjour,

Je dois récupérer des infos dans une table d'une base qui n'est pas à moi afin de les mettre dans ma base pour procéder à des stats.
La table source est simple elle à 3 champs
ts = timestamp
object = varchar nom de l'objet
value = varchar la valeur
Exemple :
object ts valeur
Stat_object_1 18/01/2015 18:59:01 0.11
Stat_object_1 18/01/2015 18:59:21 0.1
Stat_object_1 18/01/2015 18:59:26 1.29
Stat_object_1 18/01/2015 18:59:31 0.59
Stat_object_1 18/01/2015 18:59:36 0.59
Stat_object_1 18/01/2015 18:59:41 0.59
Stat_object_1 18/01/2015 18:59:46 0.69
Stat_object_1 18/01/2015 18:59:51 0.6
Stat_object_1 18/01/2015 18:59:56 0.69
...


Il y plusieurs valeurs par minutes, ce qui fait beaucoup d'occurrences. Je souhaites au moment où je récupère les infos les 'agréger par minutes'
Récupérer quelque chose comme
Stat_object_1 18/01/2015 18:59 10.25
Stat_object_1 18/01/2015 19:00 xx.xx
Stat_object_1 18/01/2015 19:01 xx.xx
etc

Cela est-il possible de façon simple ?

J'ai fait pas mal d'essai et je n'y arrive pas :
select object, date(ts), hour(ts) as Hours,
minute(ts) as Minutes, sum(0+value) as sum_value
from base.table
group by ts ;

--> ne fonctionne pas, je n'ai pas la somme

SELECT ts,object,sum(value + 0)value FROM base.table
where day(ts)=18 and hour(ts)=19 and minute(ts)=3
group by object;

--> à titre de test fonctionne mais si j'enlève la clause where ne fonctionne pas

Merci par avance de votre aide

A voir également:

2 réponses

flokocha Messages postés 1510 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 10 octobre 2015 281
23 janv. 2015 à 14:18
Salut,

Ta première approche me parait bonne. Le piège principal est effectivement que ta colonne value contient des nombres que tu souhaites additionner, mais est de type varchar. Par conséquent, cela reviendrait pour mysql à faire la somme de "toto" et "tata", ce qui est impossible. Mais additionner ce contenu de type varchar avec 0 comme tu le fais devrait suffire à transformer ce varchar en float aux yeux de mysql. Sinon, tu aurais aussi pu le caster en type decimal via la fonction DECIMAL().

Selon moi ton problème se situe donc au niveau de ton group by. En faisait un group by ts, tu conserves un détail à la seconde, tandis que tu veux un détail à la minute. De plus, tu perds potentiellement le détail par objet si tu en a plusieurs sur le même ts.

Il faut donc grouper à la fois sur les objets, sur les dates, sur les heures, et sur les minutes.

Je te conseille donc de tester ceci :

select object, date(ts) as Dates, hour(ts) as Hours, 
minute(ts) as Minutes, sum(0+value) as sum_value 
from base.table 
group by object, Dates, Hours, Minutes;
0
cerizee Messages postés 2 Date d'inscription vendredi 23 janvier 2015 Statut Membre Dernière intervention 23 janvier 2015
Modifié par cerizee le 23/01/2015 à 14:40
La somme de l'objet fonctionne bien, mais je n'ai plus tous mes objets, mais un seul

edit:

avec group by Hours, Minutes, object; cela semble fonctionner.

Merci beaucoup pour l'aide
0
flokocha Messages postés 1510 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 10 octobre 2015 281
23 janv. 2015 à 14:36
Tu as tous les objets les uns à la suite des autres, une fois que toutes les combinaisons de dates, heures, minutes d'un objet sont terminées.

En gros tu auras quelque chose comme :
objet 1 | date heure minute 1 | somme
objet 1 | date heure minute 2 | somme
...
objet 1 | date heure minute N | somme
objet 2 | date heure minute 1 | somme
objet 2 | date heure minute 2 | somme
...

Si tu veux plutôt les lister en priorité par ordre de date et non par ordre d'objet, c'est à dire sous cette forme :

objet 1 | date heure minute 1 | somme
objet 2 | date heure minute 1 | somme
objet 1 | date heure minute 2 | somme
objet 2 | date heure minute 2 | somme
...
objet 1 | date heure minute N | somme
objet 2 | date heure minute N | somme
...

Il faut alors que tu changes l'ordre dans lequel tu effectues le group by, en passant object en dernier (et non en premier).
0