Je vais graphiser des données NetFlow stockées dans une base de données MySQL et j'ai besoin d'un moyen efficace d'obtenir les points de données pertinents. Ils sont enregistrés sont stockés avec la date comme in int pendant quelques secondes depuis l'époque. J'aimerais pouvoir ressembler à quelque chose comme: est-il de toute façon pour faire cela? Ou, serait-il plus rapide de le gérer localement dans Python? Même pour une table de 500 000 rangées? P> EDIT STRUT>
Mon erreur, le temps est stocké comme un double non signé au lieu d'un Int.
J'utilise actuellement groupe par (étage (STIME / I)) code> où je suis l'intervalle souhaité. P> p>
6 Réponses :
Avez-vous essayé ce qui suit? Juste dévier la colonne Tyiem par 10 et arrondir le résultat vers le bas. Je ne sais pas la fonction ronde () et le regroupement avec les appels de fonction fonctionne dans MySQL cependant, ce qui précède est T- SQL. P> P>
Rond me donne des intervalles très variables, plus d'une période de dix minutes, je reçois quelques intervalles aussi petits que 7Secs, et certains aussi grands que 1 min ...
Vous pourrez peut-être faire cela en utilisant une division entière. Pas sûr de la performance.
Que je sois l'intervalle de votre choix en secondes. P>
J'ai utilisé des suggestions des deux réponses et un collègue. Le résultat final est le suivant:
Select FROM_UNIXTIME(stime), bytes from argusTable_2009_10_22 where stime > (UNIX_TIMESTAMP()-600) group by floor(stime /10)
Le problème: p> parfois sol code> dans le groupe par parfois échoue. Il regroupe parfois des moments différents comme une valeur par exemple lorsque vous divisez la valeur avec 3, mais cela ne fait pas de même lorsque vous divisez avec 4, bien que la différence entre ces deux valeurs soit beaucoup plus grande que 3 ou 4 qu'il devrait regrouper comme deux groupes différents. Mieux jeté à un non signé après étage fonctionnant comme:
groupe par étage (UNIX_TIMESTAMP (TIME_FIELD) / 3) CODE > donne moins de groupes par rapport au groupe
par étage (UNIX_TMESTAMP (TIME_FIELD) / 4) CODE>, qui ne devrait pas être possible mathématiquement. p> p>
Il est mathématiquement très bien possible. Disons que les valeurs sont "3" et "4", puis divisées par 3 donnent à la fois 1, tout en divisant par 4, ils donnent 0 et 1. Le regroupement par / 4 donnera donc plus de groupes dans ce cas.
Je l'ai fait il y a quelques temps, alors j'ai créé une fonction (avec SQL Server, mais je suppose que c'est presque la même):
J'ai d'abord créé une fonction scalaire qui me renvoie l'ID d'une date en fonction d'une date d'une date. intervalle et une partie de date (minute, heure, jour, mite, année): p> puis j'ai créé une fonction de table qui me renvoie tous les identités entre une plage de date: < / p> Donc, si je veux compter tout l'utilisateur ajouté pour chaque intervalle de 33 minutes: p> groupe par DBO. geiddate (utilisateur.creation_date, 'minute', 33)
Commande par horaire.Startdate p> :) p> p>
SELECT sec_to_time(time_to_sec(datefield)- time_to_sec(datefield)%(10)) as intervals,SUM(bytes) FROM table WHERE where stime > x and stime < Y group by intervals