Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql中的运行时计算_Mysql - Fatal编程技术网

mysql中的运行时计算

mysql中的运行时计算,mysql,Mysql,我需要一些关于update语句的建议来填充run for表中的一列。我使用的是mysql 5.6.25-。请查找下表和数据脚本 create table test (symbol varchar(2), sym_date date, amount int, diff_amt int PRIMARY KEY (symbol,sym_date)) engine=InnoDB; insert into test(symbol,sym_date, amount) values('A','2015-07

我需要一些关于update语句的建议来填充run for表中的一列。我使用的是mysql 5.6.25-。请查找下表和数据脚本

create table test (symbol varchar(2), sym_date date, amount int, diff_amt int PRIMARY KEY (symbol,sym_date)) engine=InnoDB;

insert into test(symbol,sym_date, amount) values('A','2015-07-01',200);
insert into test(symbol,sym_date, amount) values('A','2015-07-02',100);
insert into test(symbol,sym_date, amount) values('A','2015-07-03',500);
insert into test(symbol,sym_date, amount) values('A','2015-07-04',800);
insert into test(symbol,sym_date, amount) values('B','2015-07-03',300);
insert into test(symbol,sym_date, amount) values('B','2015-07-05',500);
insert into test(symbol,sym_date, amount) values('B','2015-07-06',600);
insert into test(symbol,sym_date, amount) values('C','2015-07-09',100);
insert into test(symbol,sym_date, amount) values('C','2015-07-11',100);
insert into test(symbol,sym_date, amount) values('C','2015-07-12',100);
我需要基于symbol的结果集之间的金额列差异,而symbol、sym_日期在剩余列差异金额中按升序排列

select symbol, sym_date, amount from test order by symbol, sym_date;

It will give me this result set.

symbol   sym_date      amount
----------------------------
A       2015-07-01      200
A       2015-07-02      100
A       2015-07-03      500
A       2015-07-04      800
B       2015-07-03      300
B       2015-07-05      500
B       2015-07-06      600
C       2015-07-09      100
C       2015-07-11      100
C       2015-07-12      100
我需要将diff_amt列填充为结果集中的差异。对于每个符号,其第一个值将相同。下一行是第二个值-第一个值,它将给出结果r1。下一行将是第三个值-r1和contiue相同

Expected result set will be as below:

symbol   sym_date     amount   diff_amt
-------------------------------------------------
A       2015-07-01      200     200         -- (ar1 = A1)
A       2015-07-02      100     -100        -- (ar2 = A2 - ar1)
A       2015-07-03      500     600         -- (ar3 = A3 - ar2)
A       2015-07-04      800     200         -- (ar4 = A4 - ar3)
B       2015-07-03      300     300         -- (br1 = B1)
B       2015-07-05      500     200         -- (br2 = B2 - br1)
B       2015-07-06      600     400         -- (br3 = B3 - br2)
C       2015-07-09      100     100         -- (cr1 = C1)
C       2015-07-11      100     0           -- (cr2 = C2 - cr1)
C       2015-07-12      100     100         -- (cr3 = C3 - cr2)

这只是一个示例场景。我正在寻找适用于大表的通用解决方案。

您可以使用变量来实现这一点。我认为逻辑如下:

select t.*,
       (@val := if(@s = symbol, amount - @val,
                   if(@s := symbol, amount, amount)
                  )
       ) as diff_amount
from test t cross join
     (select @s := '', @val := 0) params
order by symbol, sym_date;