2011-10-07 4 views
0

J'ai quelques données que je veux récupérer, mais je veux les regrouper par un nombre spécifique de secondes. Par exemple, si ma table ressemble à ceci:Regrouper les résultats par période

| id | user | pass | created | 

La colonne est created INT et est titulaire d'un horodatage (nombre de secondes à partir de 1970).

Je voudrais le nombre d'utilisateurs qui sont créés entre le mois dernier et la date actuelle, mais les montrer groupés par 7*24*3600 (une semaine). Donc, si dans la gamme il y a 1000 nouveaux utilisateurs, demandez-leur de montrer combien d'inscrits chaque semaine (100 la première semaine, 450 la seconde, 50 la troisième et 400 la 4e semaine - quelque chose comme ça).

J'ai essayé de regrouper les résultats par created/7*24*3600, mais cela ne fonctionne pas.

À quoi ma requête ressemblerait-elle?

+0

Quel type de colonne est 'created'? –

+0

Désolé, j'ai oublié de le mentionner. C'est INT, et il contient un horodatage en secondes. –

Répondre

2

Vous devez utiliser la division entière div sinon le résultat se transformera en un réel et aucune des semaines ne sera résolue à la même valeur.

SELECT 
    (created div (7*24*60*60)) as weeknumber 
    , count(*) as NewUserCount 
FROM users 
WHERE weeknumber > 1 
GROUP BY weeknumber 

Voir: http://dev.mysql.com/doc/refman/5.0/en/arithmetic-functions.html

+0

Merci, votre solution m'a fourni une information importante: 'div' –

+1

+1 Mais tenez compte du fait que' div' est une syntaxe spécifique à mysql. La même chose pourrait être réalisée en utilisant la fonction SQL2003 Standard 'floor()'. –

+0

@ XaviLópez, dans le serveur SQL, l'opérateur '/' renvoie un entier truqué si les deux opérandes sont des entiers. – Johan

1

D'accord ici sont les options possibles que vous pouvez essayer:

GROUPE PAR JOUR

select count(*), DATE_FORMAT(created_at,"%Y-%m-%d") as created_day FROM widgets GROUP BY created_day 

GROUPE PAR MOIS

select count(*), DATE_FORMAT(created_at,"%Y-%m") as created_month FROM widgets GROUP BY created_month 

GROUPE PAR AN

select count(*), DATE_FORMAT(created_at,"%Y") as created_year FROM widgets GROUP BY created_year 
2

Vous devez conserver la partie entière seulement de cette division. Vous pouvez le faire avec la fonction floor(). Avez-vous essayé select floor(created/604800) as week_no, count(*) from users group by floor(created/604800)?

Je suppose que vous avez trié la partie "Sélectionner les utilisateurs créés au cours du dernier mois".

+0

Merci. Mon problème était que j'utilisais l'opérateur '/' pour faire des divisions, au lieu de 'div'. Mais l'idée principale est quelque chose comme votre requête. –

Questions connexes