嗨我需要对我的代码提供一些帮助,它几乎是正确的,但只是一个小问题。
我的搜索结果中有3列:
entries_per_week
每周都会收到新条目
可能是5个星期3个下一个8个下一个星期等等。total_entries
每周跟踪总条目数
它不断添加'entries_per_week'列。6WK_total
累计前6周。所以基本上加起来previous_total_entries
中的6个。我几乎已经开始工作了,但是在新的一年开始时,6WK_total
从那一年开始新的,而不是将上一年的参赛作品加起来。
这是我的代码:
SELECT a.*
, sum(b.total_entries) 6WK_total
FROM
( SELECT x.*
, SUM(y.entries_per_week) total_entries
FROM
( SELECT YEARWEEK(date_created) week_created
, COUNT(*) entries_per_week
FROM entries
GROUP
BY week_created
) x
JOIN
( SELECT YEARWEEK(date_created) week_created
, COUNT(*) entries_per_week
FROM entries
GROUP
BY week_created
) y
ON y.week_created <= x.week_created
GROUP
BY x.week_created
) a
JOIN
( SELECT x.*
, SUM(y.entries_per_week) total_entries
FROM
( SELECT YEARWEEK(date_created) week_created
, COUNT(*) entries_per_week
FROM entries
GROUP
BY week_created
) x
JOIN
( SELECT YEARWEEK(date_created) week_created
, COUNT(*) entries_per_week
FROM entries
GROUP
BY week_created
) y
ON y.week_created <= x.week_created
GROUP
BY x.week_created
) b
ON b.week_created BETWEEN a.week_created - (6 - 1) AND a.week_created
GROUP
BY week_created;
发生了什么,这里有一些结果,注意凝视(**)结果,我想要的结果在下面的另一个表中。它应该是1056,如下面所需的结果表而不是248
+--------------+-------+-----------------------+-----------+
| week_created | total | total_entries | 6WK_total |
+--------------+-------+-----------------------+-----------+
| 201149 | 49| 131 | 243 |
| 201150 | 37| 168 | 411 |
| 201151 | 37| 205 | 614 |
| 201152 | 18| 223 | 837 |
**| 201201 | 25| 248 | 248 |**
| 201202 | 33| 281 | 529 |
| 201203 | 66| 347 | 876 |
| 201204 | 70| 417 | 1293|
| 201205 | 61| 478 | 1771|
| 201206 | 88| 566 | 2337|
| 201207 | 72| 638 | 2727|
| 201208 | 72| 710 | 3156|
| 201209 | 67| 777 | 4030|
+--------------+-------+-----------------------+-----------+
期望的结果,在week_create'201206'注意6周的总数将是total_entries中的前6个结果所以它将是566 + 478 + 417 + 347 + 281 + 248 = 2337。
+--------------+-------+-----------------------+-----------+
| week_created | total | total_entries | 6WK_total |
+--------------+-------+-----------------------+-----------+
| 201149 | 49| 131 | 243 |
| 201150 | 37| 168 | 411 |
| 201151 | 37| 205 | 614 |
| 201152 | 18| 223 | 837 |
| 201201 | 25| 248 | 1056|
| 201202 | 33| 281 | 1256|
| 201203 | 66| 347 | 1472|
| 201204 | 70| 417 | 1127|
| 201205 | 61| 478 | 1989|
| 201206 | 88| 566 | 2337|
| 201207 | 72| 638 | 2727|
| 201208 | 72| 710 | 3156|
| 201209 | 67| 777 | 4030|
+--------------+-------+-----------------------+-----------+
由于
答案 0 :(得分:0)
我不确定我是否关注你所写的所有内容,但如果我这样做,那么你的问题似乎就在你用来提取周的YEARWEEK函数中。
以上是您上面示例中发生的情况。当YEARWEEK功能应用于2012年的第一周时,它将解析为'201201',但是当YEARWEEK功能应用于2011年的最后一周时,它将变为'201153'。由于一年中没有100周,因此上一个月是201153而不是201199,查询结束时的inter子句在年初失败。
如果您将星期添加字段保留为日期格式并且仅在外部查询中应用YEARWEEK函数,则可以使用DATE_SUB()函数为您执行周减法。这可能看起来像BETWEEN DATE_SUB(week_created, INTERVAL 5 WEEK) AND week_created
。