MySQL:A列和B列累计和到B列

标签 mysql sql

我有以下示例数据。 HERE 我需要获取每个日期、时间、商店的 abc-xyzreqdcolumn 列的累计总和。 我的 mysql 版本是 5.7 Row over 解决方案不适用于我的 mysql 版本。

示例数据

date      hour  Shop       abc     xyz  Diffabcxyz  ReqdColumn
---------------------------------------------------------------
20190428    1       1       0       0       0           0
20190428    2       1       5       4       1           0
20190428    3       1       15      8       7           1
20190428    4       1       16      9       7           8
20190428    5       1       14      13      1           15
20190428    6       1       8       12      -4          16
20190428    7       1       14      16      -2          12
20190428    8       1       9       7       2           10
20190428    9       1       5       2       3           12
20190428    10      1       6       2       4           15
20190428    1       2       0       0       0           0
20190428    2       2       7       1       6           0
20190428    3       2       5       -2      3           6
20190428    4       2       6       -5      1           9
20190428    5       2       4       7       -3          10
20190428    6       2       5       -8      -3          7
20190428    7       2       2       -9      -7          4
20190428    8       2       9       -10     -1          -3
20190428    9       2       6       4       2           -4
20190428    10      2       2       -12     -10         -2
20190428    1       3       0       0       0           0
20190428    2       3       6       -11     -5          0
20190428    3       3       8       -4      4           -5
20190428    4       3       5       -5      0           -1
20190428    5       3       9       8       1           -1
20190428    6       3       2       -1      1           0
20190428    7       3       4       4       0           1
20190428    8       3       1       2       -1          1
20190428    9       3       11      -4      7           0
20190428    10      3       0       1       -1          7

我尝试做一个累加和,但不知道如何按结果集分组。

测试代码:

测试选择

set @csum := 0;

SELECT 
    date, hour, shop, (@csum:=@csum + Diffabcxyz)
FROM
    SampleTable
GROUP BY date, hour, shop;

测试更新

set @csum := 0;
update sampletable
set reqdcolumn = (@csum := @csum + Diffabcxyz);

我需要根据日期、时间和商店的结果集进行分组。

样本数据和要求的结果是here . ReqdColumn 是期望的输出

最佳答案

您可以实现 SQL Server LAG 功能以获得累积总和:

select @lagDate := 0, @lagShop := 0, @diffLag := 0, @cumSum := 0;

select *,
       case when @lagDate = Date and @lagShop = Shop then @cumSum := @cumSum + @diffLag else @cumSum := 0 end,
       @diffLag := Diffabcxyz,
       @lagDate := Date,
       @lagShop := Shop
from tbl
order by shop, date, hour

Demo

关于评论的更新:

Can you please tell me how can i get it to not do the cumulative count for the first 3 hours?

select @lagDate := 0, @lagShop := 0, @diffLag := 0, @cumSum := 0, @diffLagLag := 0;

select *,
       case when @lagDate = Date and @lagShop = Shop then @cumSum := @cumSum + @diffLagLag else @cumSum := 0 end,
       @diffLagLag := @diffLag,
       @diffLag := Diffabcxyz,
       @lagDate := Date,
       @lagShop := Shop
from tbl
order by shop, date, hour

Another demo

另一个更新:

select @lagDate := 0, @lagShop := 0, @diffLag := 0, @cumSum := 0;

select *,
       case when @lagDate = Date and @lagShop = Shop and Hour > 3 then @cumSum := @cumSum + @diffLag else @cumSum := 0 end,
       @diffLag := Diffabcxyz,
       @lagDate := Date,
       @lagShop := Shop
from tbl
order by shop, date, hour

Yet another demo

关于MySQL:A列和B列累计和到B列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55898202/

相关文章:

MySQL,查找列中每个字符串/单词的频率

mysql - rails、authlogic 和 sql 错误

php - 用数组填充 HTML 表并创建链接

mysql - SQL 仅选择列上具有最大值的行

sql - 字符串或二进制数据将被截断,字段查找

php - 尝试将 mysql 表 id 行放入 php 变量中以从中进行进一步的 mysql 查询

sql - 和 OR 在 sql server 中的同一列

mysql - 插入....选择查询返回空白

c# - 数据库触发器还是代码中的常用方法?

mysql - 如何根据起始点显示特定行数