0

たとえば、次の表があります。

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
4

1 に答える 1

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;

パフォーマンスが問題になる場合は、変数型のソリューションが登場することは間違いありません。

于 2016-02-24T16:48:28.553 に答える