2015-03-20 2 views
1

Этот вопрос связан с поста я сделал ранее: MySQL: Calculating Data from Table with One Month OffsetMySQL: Расчет 4 недели Average с 4 недели 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 недели смещение на вершине этого. Например, если бы я хотел получить средние контакты за неделю с 8 марта 2015 года, это будет в среднем с 18 января по 8 февраля. В приведенном выше примере мое среднее значение будет: (10 + 16 + 2 + 8)/4 = 9. И если бы я хотел найти среднее значение за неделю с 1 марта 2015 года, тогда было бы среднее значение с 11 января по 1 февраля, которое получилось бы 8, используя приведенную выше таблицу образцов.

С моего последнего поста, я знаю, что я могу справиться с 4 недели смещения путем присоединения к таблице с собой на WEEK_START_DATE похожее на это:

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; 

Но получить его, чтобы вычислить среднее четыре недели, а также где я застрял. Я думал, что присоединение к нему на нескольких датах будет работать, но я продолжаю получать средние значения, которые намного больше, чем ожидалось. Я предполагаю, что это связано с тем, как group_start_date сгруппированы. (Обратите внимание, что за каждую неделю может быть несколько записей. Я показываю только одну запись за каждую неделю в таблице примеров, чтобы сделать ее менее загроможденной.)

Входит ли в диапазон дат правильный подход? Или мне нужно добавить другое соединение?

Благодарим за помощь.

ответ

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; 
+0

Выглядит идеально для меня;) –

0

Я хотел бы использовать функцию DATE_SUB() и просто вычесть необходимые недели вам нужно. Так, 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.

Смежные вопросы