这个问题与我之前发的帖子有关: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 的分组方式所致。 (请注意,每周可以有多条记录。我在示例表上每周只显示一条记录,以使其不那么困惑。)
在某个日期范围内加入是正确的方法吗?或者我需要在某处添加另一个连接吗?
感谢您的帮助。
最佳答案
我建议使用相关子查询:
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;
关于MySQL:使用 4 周偏移量计算 4 周平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29174153/