2011-01-20 66 views
3

我有一組或多組記錄,並且我想對它們進行計數並將它們組合在一定範圍內,例如,我想,以計算團體創建的X天X天範圍內的組

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

回答

3

,你可以這樣做
SELECT COUNT(*) FROM table GROUP BY FLOOR(created/3)

記錄......我想。

雖然如果created是日期字段,你必須做一些更拉坯得到它變成一個數值這個工作。

4

以下是帶日期的示例。

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

Thanks @Ronnis,我用你的例子,最後解決我的問題。

而且還有一個小錯誤,我發現,例如,我添加了一行

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

現在,我得到:

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

正如你可以看到,天分爲2,3, 3,3,2這不是我所期望的。

更改SQL作爲

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); 

從創建開始日期剛剛得到DATEDIFF,現在我得到:

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

這可能更適合。