此问题与我之前发布的帖子有关:MySQL: Calculating Data from Table with One Month Offset
但现在我需要构建一个查询按周存储的联系人数据表的过程。这是我正在使用的表格的简化示例:
+-----------------+------------+
| week_start_date | contacts |
+-----------------+------------+
| 2015-03-08 | 12 |
| 2015-03-01 | 20 |
| 2015-02-22 | 5 |
| 2015-02-15 | 17 |
| 2015-02-08 | 8 |
| 2015-02-01 | 2 |
| 2015-01-25 | 16 |
| 2015-01-18 | 10 |
| 2015-01-11 | 4 |
| ... | ... |
+-----------------+------------+
我需要弄清楚的是如何计算一个4周移动平均线,它还有4周的偏移量。例如,如果我想得到2015年3月8日这一周的平均联系人,那么它将是1月18日到2月8日的平均值。在上面的例子中,我的平均值是:(10 + 16 + 2 + 8) )/ 4 = 9.如果我想找到2015年3月1日那周的平均值,那么它将是1月11日到2月1日的平均值,使用上面的样本表得出8。
从我上一篇文章中,我知道我可以通过将此表连接到week_start_date来处理4周的偏移量,类似于:
SELECT s1.week_start_date, s2.Total_Contacts
FROM sample_table s1
LEFT JOIN (SELECT week_start_date, sum(contacts) AS Total_Contacts
FROM sample_table
GROUP BY week_start_date) s2
ON s1.week_start_date =
date_add(s2.week_start_date, INTERVAL 4 WEEK)
WHERE s1.week_start_date = '2015-03-08'
GROUP BY s1.week_start_date;
但让它计算四周的平均值也是我陷入困境的地方。我认为在一系列日期加入它会起作用,但我不断获得比预期更大的平均值。我猜这是由于week_start_date的分组方式。 (请注意,每周可以有多个记录。我只在样本表上每周显示一条记录,以减少它的混乱。)
加入日期范围是正确的做法吗?或者我需要在某处添加另一个联接?
感谢您的帮助。
答案 0 :(得分:1)
我建议使用相关的子查询:
select st.*,
(select avg(contacts)
from sample_table st2
where st2.week_start_date >= st.week_start_date - interval 7 * 7 days and
st2.week_start_date <= st.week_start_date - interval 4 * 7 days
) as avg_4week_delayed
from sample_table st;
答案 1 :(得分:0)
我会使用DATE_SUB()函数,只需减去你需要的几周。所以,对于你的例子中的3月8日,尝试这样的事情:
SELECT AVG(contacts)
FROM myTable
WHERE week_start_date <= DATE_SUB('2015-03-08', INTERVAL 4 WEEK) AND week_start_date >= DATE_SUB('2015-03-08', INTERVAL 7 WEEK);
它适用于SQL Fiddle。