2011-01-20 3 views
3

J'ai un ensemble ou des enregistrements et je veux les compter et les regrouper par une certaine plage, par ex. Je veux compter les enregistrements qui ont été créés par des groupes de X joursGroupe par une plage de X jours

e.g. SELECT COUNT(*) FROM `table` GROUP BY /*`created` 3 days/* 

Répondre

3

Vous pouvez faire quelque chose comme
SELECT COUNT(*) FROM table GROUP BY FLOOR(created/3)

... Je pense.

Bien que si created est un champ de date, vous devrez faire un peu plus de jiggering pour obtenir une valeur numérique pour que cela fonctionne.

4

Voici un exemple avec des dates.

create table t1(created date not null); 

insert 
    into t1(created) values (date '2011-01-09') 
         ,(date '2011-01-10') 
         ,(date '2011-01-11') 
         ,(date '2011-01-12') 
         ,(date '2011-01-13') 
         ,(date '2011-01-14') 
         ,(date '2011-01-15') 
         ,(date '2011-01-16') 
         ,(date '2011-01-17') 
         ,(date '2011-01-18') 
         ,(date '2011-01-19') 
         ,(date '2011-01-20'); 

select floor(datediff(now(), created)/3) * 3 as days_ago 
     ,min(created) 
     ,max(created) 
     ,count(*) 
    from t1 
group 
    by floor(datediff(now(), created)/3); 

+----------+--------------+--------------+----------+ 
| days_ago | min(created) | max(created) | count(*) | 
+----------+--------------+--------------+----------+ 
|  0 | 2011-01-18 | 2011-01-20 |  3 | 
|  3 | 2011-01-15 | 2011-01-17 |  3 | 
|  6 | 2011-01-12 | 2011-01-14 |  3 | 
|  9 | 2011-01-09 | 2011-01-11 |  3 | 
+----------+--------------+--------------+----------+ 
4 rows in set (0.00 sec) 
1

Merci @Ronnis, j'utilise votre exemple et enfin résoudre mon problème.

Et il y a une petite erreur que je trouve, dans l'exemple, ajouter une ligne

insert into t1(created) values (date '2011-01-21') 

Maintenant je:

+----------+--------------+--------------+----------+ 
| days_ago | min(created) | max(created) | count(*) | 
+----------+--------------+--------------+----------+ 
|  1986 | 2011-01-20 | 2011-01-21 |  2 | 
|  1989 | 2011-01-17 | 2011-01-19 |  3 | 
|  1992 | 2011-01-14 | 2011-01-16 |  3 | 
|  1995 | 2011-01-11 | 2011-01-13 |  3 | 
|  1998 | 2011-01-09 | 2011-01-10 |  2 | 
+----------+--------------+--------------+----------+ 

Comme vous pouvez le voir que les jours se divisent en 2, 3, 3, 3, 2 ce qui n'est pas ce que je m'attendais.

Je change SQL comme

select floor(datediff(created, '2011-01-09')/3) * 3 as days_before 
     ,min(created) 
     ,max(created) 
     ,count(*) 
from t1 
group by floor(datediff(created, '2011-01-09')/3); 

Procurez-vous datediff de créé pour la date de début, et maintenant je reçois:

+-------------+--------------+--------------+----------+ 
| days_before | min(created) | max(created) | count(*) | 
+-------------+--------------+--------------+----------+ 
|   0 | 2011-01-09 | 2011-01-11 |  3 | 
|   3 | 2011-01-12 | 2011-01-14 |  3 | 
|   6 | 2011-01-15 | 2011-01-17 |  3 | 
|   9 | 2011-01-18 | 2011-01-20 |  3 | 
|   12 | 2011-01-21 | 2011-01-21 |  1 | 
+-------------+--------------+--------------+----------+ 

qui pourrait être plus approprié.

Questions connexes