2014-07-03 33 views
0

计算与日期间隔统计我要计算的日期和动态间隔(周,月,年)整理一些状态信息(与MySQL后端)。 这里是一个小例子:如何通过MySQL的

MySQL表: tracker_click

| ID | SITE_ID | CREATED_AT   | 
| ---- |---------| --------------------| 
| 153 | 2  | 2013-07-22 15:43:25 | 
| 154 | 2  | 2013-07-25 16:45:46 | 
| 2501 | 2  | 2013-09-15 17:45:48 | 

我想SITE_ID按周来获得总点击数上个月与一个查询 并按月同样的事情去年。

什么,我想通过本周上个月的一个例子是:

| click number | SITE_ID | BEGIN_DATE   | END_DATE   | 
|----------------|---------|----------------------|---------------------| 
| 25    | 2 | 2013-07-01 00:00:00 | 2013-07-08 00:00:00 | 
| 19    | 2 | 2013-08-09 00:00:00 | 2013-08-16 00:00:00 | 
| 53    | 2 | 2013-0717- 00:00:00 | 2013-08-24 00:00:00 | 

我不知道是否有一个解决方案,使exaclty这个数组只有一个查询没有任何其他进程。

谢谢

+0

要做到这一点的几个月,假设你要个月上市,其中计数为零,为你生成所需的时间周期的列表,然后左边加入你的数据。 – Kickstart

回答

2

这应该让你上个月的计数(即,过去4周),包括周其中计数为每个站点id为0。如果您有一个站点表来从中获取站点ID,则意味着交叉连接到子查询可以用一个简单的交叉连接替换为一个表。

这会生成一系列从0到5的数字,并从当前日期中减去该周数,格式为给出结果周的周日和周六,并检查结束周是当前日期之间的一周并且当前日期减去1个月(以这种方式完成,而不是仅仅减去4周以应付可变长度的月份)。

SELECT Weeks.aWeek_start, Weeks.aWeek_end, all_site_id.site_id, COUNT(tracker_click.id) 
FROM 
(
    SELECT STR_TO_DATE(DATE_FORMAT(DATE_SUB(NOW(), INTERVAL units.i WEEK), '%Y%U Sunday 00:00:00'), '%X%V %W %H:%i:%s') AS aWeek_start, 
      STR_TO_DATE(DATE_FORMAT(DATE_SUB(NOW(), INTERVAL units.i WEEK), '%Y%U Saturday 23:59:59'), '%X%V %W %H:%i:%s') AS aWeek_end 
    FROM (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5)units 
    WHERE DATE_FORMAT(DATE_SUB(NOW(), INTERVAL units.i WEEK), '%Y%U') BETWEEN DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH), '%Y%U') AND DATE_FORMAT(NOW(), '%Y%U') 
) Weeks 
CROSS JOIN 
(
    SELECT DISTINCT site_id 
    FROM tracker_click 
) AS all_site_id 
LEFT OUTER JOIN tracker_click 
ON tracker_click.CREATED_AT BETWEEN Weeks.aWeek_start AND Weeks.aWeek_end 
AND tracker_click.site_id = all_site_id.site_id 
GROUP BY Weeks.aWeek_start, Weeks.aWeek_end, all_site_id.site_id 

类似的查询可以完成全年

SELECT Months.aMonth_start, Months.aMonth_end, all_site_id.site_id, COUNT(tracker_click.id) 
FROM 
(
    SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL units.i MONTH), '%Y/%m/01 00:00:00') AS aMonth_start, 
      DATE_FORMAT(LAST_DAY(DATE_SUB(NOW(), INTERVAL units.i MONTH)), '%Y/%m/%d 23:59:59') AS aMonth_end 
    FROM (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11)units 
) Months 
CROSS JOIN 
(
    SELECT DISTINCT site_id 
    FROM tracker_click 
) AS all_site_id 
LEFT OUTER JOIN tracker_click 
ON tracker_click.CREATED_AT BETWEEN Months.aMonth_start AND Months.aMonth_end 
AND tracker_click.site_id = all_site_id.site_id 
GROUP BY Months.aMonth_start, Months.aMonth_end, all_site_id.site_id 
+0

谢谢你的答案的Kickstart, 我有正确的行号,日期也是正确的,但跟踪计数不正常, 每一行给我点击的错误计数。 我有只有一行在我的表站点954 tracker_count应始终为0,除了最后一行(1) – Jaybe

+0

看来,“计数(tracker_click_id)”计数每次都行不仅每间行日期 – Jaybe

+0

我看不到它的错误(虽然我可能会错过一些东西)。你可以在SQL小提琴上设置表格和少量数据来演示它吗? – Kickstart

0
SELECT count(*), site_id, extract(WEEK from created_at) as start_date, 
date_add(extract(WEEK from created_at), 1, week) as end_date 
FROM click_tracker 
GROUP BY site_id, extract(WEEK from created_at) 

,你可以添加where子句额外筛选结果。