【问题标题】:Calculating a Rolling Sum Based on Row基于行计算滚动和
【发布时间】:2019-04-02 18:01:56
【问题描述】:

我正在尝试根据 DateTime 行计算当前行和前 4 行之间两列“重量”和“体积”的滚动总和。这些是大量的日志,有时我们会收到多个负载。所以本质上,每次有新的负载进来时,它都会根据自己和前 4 行计算一个新的滚动总和。我正在使用 MySQL 5.7。请记住,每一行都不是新日期。数据应该是这样的......

         DateTime       | Weight | Volume | Roll_Weight | Roll_Volume
    2019-01-01 08:00:00 | 54000  | 72.2   |   54000     |   72.2
    2019-01-01 09:30:00 | 29000  | 38.0   |   83000     |  110.2
    2019-01-05 13:00:00 | 38900  | 54.8   |  118900     |  165.0 
    2019-01-06 07:00:00 | 44000  | 56.2   |  162900     |  221.2
    2019-01-06 12:30:00 | 49000  | 18.0   |  211900     |  239.2
    2019-01-07 09:00:00 | 27900  | 84.5   |  185800     |  251.5
    2019-01-10 08:00:00 | 94000  | 72.6   |  250800     |  286.1
    2019-01-10 13:30:00 | 65000  | 39.7   |  286800     |  271.0
    2019-01-10 15:00:00 | 38900  | 50.5   |  274800     |  265.3
Select DateTime, Sum(Weight), Sum(Volume) over (Partition by DateTime ORDER BY DateTime asc 4 preceding)
From t1

我知道,因为我使用的是 MySQL 5.7,所以我没有能力使用 OVER,但这似乎是我需要的。解决此问题的最佳方法是什么?我发现的所有资源的每一行都有不同的日期,所以他们只是在日期上使用自联接查询,但我不能这样做,因为我是按行滚动。

【问题讨论】:

    标签: mysql rolling-computation


    【解决方案1】:

    我们可以 COALESCEWeightVolume 的前 4 个值(按 DateTime),然后 + 将它们与各自的当前值对应起来价值观

    SELECT `DateTime`, Weight, Volume,
       Weight + 
       COALESCE((SELECT Weight 
                 FROM t1 AS t2
                 WHERE t2.`DateTime` < t3.`DateTime`
                 ORDER BY `Date` DESC LIMIT 0, 1), 0) +
       COALESCE((SELECT Weight 
                 FROM t1 AS t2
                 WHERE t2.`DateTime` < t3.`DateTime`
                 ORDER BY `Date` DESC LIMIT 1, 1), 0)+
       COALESCE((SELECT Weight 
                 FROM t1 AS t2
                 WHERE t2.`DateTime` < t3.`DateTime`
                 ORDER BY `DateTime` DESC LIMIT 2, 1), 0)+
       COALESCE((SELECT Weight 
                 FROM t1 AS t2
                 WHERE t2.`DateTime` < t3.`DateTime`
                 ORDER BY `DateTime` DESC LIMIT 3, 1), 0) AS RollWeight,
    
       Volume + 
       COALESCE((SELECT Volume 
                 FROM t1 AS t2
                 WHERE t2.`DateTime` < t3.`DateTime`
                 ORDER BY `Date` DESC LIMIT 0, 1), 0) +
       COALESCE((SELECT Volume 
                 FROM t1 AS t2
                 WHERE t2.`DateTime` < t3.`DateTime`
                 ORDER BY `Date` DESC LIMIT 1, 1), 0)+
       COALESCE((SELECT Volume 
                 FROM t1 AS t2
                 WHERE t2.`DateTime` < t3.`DateTime`
                 ORDER BY `DateTime` DESC LIMIT 2, 1), 0)+
       COALESCE((SELECT Volume 
                 FROM t1 AS t2
                 WHERE t2.`DateTime` < t3.`DateTime`
                 ORDER BY `DateTime` DESC LIMIT 3, 1), 0) AS RollVolume
    
    FROM t1 AS t3;
    

    【讨论】:

    • 不幸的是,这也不起作用。当我运行这个查询时,它只输出 4 行数据,并且 SUM 列不包含总和,而只包含该行的重量和体积。
    • @FulcrumFlex17 你是对的。我已经编辑了我的答案以使用不同的方法,我们选择最后 4 个值,然后将它们相加以获得运行总和
    猜你喜欢
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多