MySQL:计算4周平均值,周数为4周

时间:2015-03-20 19:11:11

标签: mysql sql database

此问题与我之前发布的帖子有关: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的分组方式。 (请注意,每周可以有多个记录。我只在样本表上每周显示一条记录,以减少它的混乱。)

加入日期范围是正确的做法吗?或者我需要在某处添加另一个联接?

感谢您的帮助。

2 个答案:

答案 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