6
votes

Groupe MySQL par intervalles dans une plage de dates

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: XXX

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?

EDIT Mon erreur, le temps est stocké comme un double non signé au lieu d'un Int. J'utilise actuellement groupe par (étage (STIME / I)) où je suis l'intervalle souhaité.


0 commentaires

6 Réponses :


2
votes

Avez-vous essayé ce qui suit? Juste dévier la colonne Tyiem par 10 et arrondir le résultat vers le bas. XXX

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.


1 commentaires

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 ...



4
votes

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. xxx


0 commentaires

0
votes

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)


0 commentaires

1
votes

sol 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: xxx

Le problème:

parfois groupe par étage (UNIX_TIMESTAMP (TIME_FIELD) / 3) donne moins de groupes par rapport au groupe par étage (UNIX_TMESTAMP (TIME_FIELD) / 4) , qui ne devrait pas être possible mathématiquement.


1 commentaires

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.



0
votes

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): xxx

puis j'ai créé une fonction de table qui me renvoie tous les identités entre une plage de date: < / p> xxx

Donc, si je veux compter tout l'utilisateur ajouté pour chaque intervalle de 33 minutes: xxx

groupe par DBO. geiddate (utilisateur.creation_date, 'minute', 33) Commande par horaire.Startdate

:)


0 commentaires

1
votes
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

0 commentaires