如何找到过去 30 天所有日期的移动平均值,日期间隔设置为 0

how to find moving average for all the days for the past 30 days with gap in date set to 0

我想找到过去 30 天的移动平均线。例如

今天的日期是 17/11/15,我只有

天的数据

原始数据

date           qty      
06/11/15        5       
08/11/15        7       
09/11/15        8       
10/11/15        12      
11/11/15        34      
15/11/15        45      
16/11/15        12      
17/11/15        7       

查找 30 天移动平均数据 - 需要 movingAvg 就像下面 table -movingAvg 列

date        qty     movingAvg

17/10/15        0       0   
18/10/15        0       0    
19/10/15        0       0    
20/10/15        0       0    
21/10/15        0       0   
22/10/15        0       0   
23/10/15        0       0   
24/10/15        0       0   
25/10/15        0       0    
26/10/15        0       0    
27/10/15        0       0   
28/10/15        0       0   
29/10/15        0       0   
30/10/15        0       0   
31/10/15        0       0    
01/11/15        0       0    
02/11/15        0       0   
03/11/15        0       0   
04/11/15        0       0    
05/11/15        0       0    
06/11/15        5       0.14    
07/11/15        0       1.4    
08/11/15        7       0.4    
09/11/15        8       0.67    
10/11/15        12      1.06    
11/11/15        34      2.2    
12/11/15        0       2.2    
13/11/15        0       2.2    
14/11/15        0       2.2
15/11/15        45      3.7    
16/11/15        12      4.1   
17/11/15        7       4.33

请帮我解决这个 mysql 查询,或者是否有任何替代方案。

试试这个....

SELECT * FROM  your_table
WHERE date >= DATEADD(day,-30, now()) AND date <= now()

希望这对您有所帮助..

使用MySQLstr_to_dateINTERVAL

select date,qty,avg(qty) from table    
WHERE str_to_date(date,'%d/%m/%y') >= DATE(NOW()) - INTERVAL 30 DAY 
GROUP BY date

给这只猫剥皮的方法有很多。这是一个,它使用带有所有合理日期的日历 table(一个令人沮丧的小数据集)...

CREATE TABLE calendar (dt DATE NOT NULL PRIMARY KEY);
-- INSERT values for all plausible dates. Lots of tutorials on this. 

CREATE TABLE my_table 
(date DATE NOT NULL
,qty INT NOT NULL
,PRIMARY KEY (date)
);

INSERT INTO my_table VALUES
('2015/11/06',5),
('2015/11/08',7),
('2015/11/09',8),
('2015/11/10',12),
('2015/11/11',34),
('2015/11/15',45),
('2015/11/16',12),
('2015/11/17',7);


SELECT a.* 
     , AVG(b.qty) average
  FROM 
     ( SELECT c.dt
            , COALESCE(x.qty,0) qty 
         FROM calendar c 
         LEFT 
         JOIN my_table x 
           ON x.date = c.dt 
        WHERE c.dt BETWEEN (SELECT MAX(date) - INTERVAL 31 DAY FROM my_table) AND (SELECT MAX(date) FROM my_table)
     ) a
  JOIN
     ( SELECT c.dt
            , COALESCE(x.qty,0) qty 
         FROM calendar c 
         LEFT 
         JOIN my_table x 
           ON x.date = c.dt 
        WHERE c.dt BETWEEN (SELECT MAX(date) - INTERVAL 31 DAY FROM my_table) AND (SELECT MAX(date) FROM my_table)
     ) b
    ON b.dt <= a.dt
 GROUP 
    BY a.dt;
+------------+------+---------+
| dt         | qty  | average |
+------------+------+---------+
| 2015-10-15 |    0 |  0.0000 |
| 2015-10-16 |    0 |  0.0000 |
| 2015-10-17 |    0 |  0.0000 |
| 2015-10-18 |    0 |  0.0000 |
| 2015-10-19 |    0 |  0.0000 |
| 2015-10-20 |    0 |  0.0000 |
| 2015-10-21 |    0 |  0.0000 |
| 2015-10-22 |    0 |  0.0000 |
| 2015-10-23 |    0 |  0.0000 |
| 2015-10-24 |    0 |  0.0000 |
| 2015-10-25 |    0 |  0.0000 |
| 2015-10-26 |    0 |  0.0000 |
| 2015-10-27 |    0 |  0.0000 |
| 2015-10-28 |    0 |  0.0000 |
| 2015-10-29 |    0 |  0.0000 |
| 2015-10-30 |    0 |  0.0000 |
| 2015-10-31 |    0 |  0.0000 |
| 2015-11-01 |    0 |  0.0000 |
| 2015-11-02 |    0 |  0.0000 |
| 2015-11-03 |    0 |  0.0000 |
| 2015-11-04 |    0 |  0.0000 |
| 2015-11-05 |    0 |  0.0000 |
| 2015-11-06 |    5 |  0.2174 |
| 2015-11-07 |    0 |  0.2083 |
| 2015-11-08 |    7 |  0.4800 |
| 2015-11-09 |    8 |  0.7692 |
| 2015-11-10 |   12 |  1.1852 |
| 2015-11-11 |   34 |  2.3571 |
| 2015-11-12 |    0 |  2.2759 |
| 2015-11-13 |    0 |  2.2000 |
| 2015-11-14 |    0 |  2.1290 |
| 2015-11-15 |   45 |  3.4688 |
| 2015-11-16 |   12 |  3.7273 |
| 2015-11-17 |    7 |  3.8235 |
+------------+------+---------+

生成日期范围,并将其与原始数据相结合。加入两次,一次获取当天的数量,一次获取过去 30 天的平均值。

SELECT sub0.aDate, IFNULL(od1.qty, 0), AVG(IFNULL(od2.qty, 0))
FROM
(
    SELECT DATE_SUB( CURRENT_DATE(), INTERVAL (units.a + tens.a * 10) DAY) AS aDate, DATE_SUB( CURRENT_DATE(), INTERVAL ((units.a + tens.a * 10) + 29) DAY) AS prevDate
    FROM
    (SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
    CROSS JOIN
    (SELECT 0 a UNION SELECT 1 UNION SELECT 2) tens
) sub0
INNER JOIN
(
    SELECT DATE_SUB( CURRENT_DATE(), INTERVAL (units.a + tens.a * 10) DAY) AS aDate
    FROM
    (SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
    CROSS JOIN
    (SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) tens
) sub1
ON sub1.aDate BETWEEN sub0.prevDate AND sub0.aDate
LEFT OUTER JOIN original_data  od1 ON od1.`date` = sub0.aDate
LEFT OUTER JOIN original_data  od2 ON od2.`date` = sub1.aDate
GROUP BY aDate, od1.qty
ORDER BY aDate