2016-02-24 4 views
0

У меня есть, например, в следующей таблице:Роллинг накопленная сумма на MySQL запрос

date   sales 
2016-02-01  2 
2016-02-02  4 
2016-02-03  4 
2016-02-04  7 
2016-02-05  3 
2016-02-06  1 
2016-02-07  6 
2016-02-08  3 

Я хотел бы получить столбец, который делает прокатки кумулятивную сумму продаж за х дней. Например, в течение 3-х дней мы получим:

date   sales rolling_cumul_3_days 
2016-02-01  2  2 
2016-02-02  4  6 
2016-02-03  4  10 
2016-02-04  7  15 
2016-02-05  3  14 
2016-02-06  1  11 
2016-02-07  6  10 
2016-02-08  3  10 

Можно ли получить в одном запросе, или я должен запустить накопленную сумму для каждой даты в течение последних х дней, а затем агрегировать результат?

Это общая идея у меня есть для этого запроса (но, безусловно, не правильно ...):

/* Initiate variables */ 
    SET @csum := 0; 
    SET @date_cursor := '2016-02-01' 

    /* Query for rolling result */ 
    SELECT date, sales, MAX(
     /* Query that cumulate sales on a three day interval for each date */ 
     SELECT (@csum := @csum + sales) as cumul_3_days 
     FROM table 
     WHERE date <= @date_cursor 
     AND date >= DATE_SUB(@date_cursor, INTERVAL -2 DAY); 

     /* Reset variables for next date */ 
     SET @csum := 0; 
     SET @date_cursor := DATE_ADD(@date_cursor, INTERVAL 1 DAY); 
    ) AS rolling_cumul_3_days 
    FROM table 
+0

Вы должны были бы иметь 3 переменные: 2 для сумм проката и счетчик, чтобы определить, какую переменную заменить на текущую сумму. – Shadow

ответ

0

Без переменных:

SELECT x.* 
     , SUM(y.sales) 
    FROM my_table x 
    JOIN my_table y 
    ON y.date BETWEEN x.date - INTERVAL 3-1 DAY 
    AND x.date GROUP BY x.date; 

Если производительность является проблемой, то нет сомнений в том, будет предложено решение типа переменных.