【问题标题】:Rolling cumulative sum on MySQL queryMySQL查询的滚动累积和
【发布时间】:2016-02-24 16:41:51
【问题描述】:

我有例如下表:

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

我想获得一个列,该列对 x 天的销售额进行滚动累积总和。例如,超过 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

是否可以在单个查询中获得,或者我必须对过去 x 天的每个日期运行累积总和,然后汇总结果?

这是我对此查询的一般想法(但绝对不正确......):

    /* 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

【问题讨论】:

  • 您必须有 3 个变量:2 个用于滚动总和,以及一个计数器来确定用当前金额替换哪个变量。

标签: mysql cumulative-sum rolling-sum


【解决方案1】:

没有变量:

 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;

如果性能是一个问题,那么毫无疑问会出现一个变量类型的解决方案。

【讨论】:

    猜你喜欢
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多