2011-01-20 14 views
3

私は1組のレコードを持っています。私は、私が思う...あなたは
SELECT COUNT(*) FROM table GROUP BY FLOOR(created/3)X日の範囲でグループ化する

ような何かを行うことができますX日

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

答えて

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

ありがとう@ロンニス、私はあなたの例を使用し、最後に私の問題を解決します。

そして、私が見つけた小さなミスがあり、一例では、私は

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

は、今私が手に1行追加します。

+----------+--------------+--------------+----------+ 
| 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私は期待したものではありません。

私はただ、日付を開始するために作成したからDATEDIFF取得

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

としてSQLを変更し、今私が手:

より適切かもしれません
+-------------+--------------+--------------+----------+ 
| 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 | 
+-------------+--------------+--------------+----------+ 

関連する問題