使用する 2 つのテーブル、USERS、METRICS_DAILY があります。
mysql> ユーザーを記述します。
+---------------------------+---------------------+------+-----+------------------------------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------------+---------------------+------+-----+------------------------------------------+----------------+
| USER_ID | int(11) unsigned | NO | PRI | NULL | auto_increment |
| CREATED | timestamp | NO | | CURRENT_TIMESTAMP|
+---------------------------+---------------------+------+-----+------------------------------------------+----------------+
mysql> METRICS_DAILY を記述します。
+---------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+----------------------+------+-----+---------+-------+
| USER_ID | int(11) unsigned | NO | PRI | NULL | |
| EVENT | tinyint(3) unsigned | NO | PRI | NULL | |
| DATE | date | NO | PRI | NULL | |
| COUNT | smallint(5) unsigned | NO | | 0 | |
+---------+----------------------+------+-----+---------+-------+
DATE=DATE(NOW()) と EVENT in (x,y,z) であり、USERS.CREATED が month1、month2、month3、... monthCURRENT である count 個別の USER_ID を選択する必要があります。
USERS.CREATED に対応する DATE を間接的に持っているため、METRICS_DAILY テーブルでほぼ完全に実行できます。
Created は完全なタイムスタンプです。毎月の CREATED ごとにコホートに分割する必要があります。
ここから始めます:
SELECT count(distinct METRICS_DAILY.USER_ID),CREATED,MONTH(CREATED),DATE FROM METRICS_DAILY LEFT JOIN USERS ON (METRICS_DAILY.USER_ID = USERS.USER_ID) where EVENT > 10 and DATE=DATE(NOW()) group by MONTH(CREATED) );
+---------------------------------------+---------------------+----------------+------------+
| count(distinct METRICS_DAILY.USER_ID) | CREATED | MONTH(CREATED) | DATE |
+---------------------------------------+---------------------+----------------+------------+
| 3 | 2013-01-14 09:35:16 | 1 | 2013-01-18 |
| 16 | 2012-12-15 07:07:49 | 12 | 2013-01-18 |
+---------------------------------------+---------------------+----------------+------------+
2 行セット (0.00 秒)