减去两行'使用Mysql group by ID的同一列中的值

时间:2017-10-25 05:38:46

标签: mysql row subtraction

我有一张桌子如下图所示。我想做一个分区,然后减去同一列中的值以获得差异。

由于MySQL中没有可用的分区或等效功能, 任何人都可以告诉我如何做到这一点? 我已经制定了分区,但没有制定出其他部分。

SELECT ID,Date,
       @row_number:=CASE WHEN @ID=ID THEN @row_number+1 ELSE 1 END AS row_number,
       @ID:=ID AS ID,value
FROM table1, (SELECT @row_number:=0,@ID:='') AS t 
ORDER BY id,Date;

输入:

 ID           Date        Value
1001    24-07-2017 09:43    10
1002    24-07-2017 09:43    11
1003    22-08-2017 21:42    10
1001    07-09-2017 20:33    11
1003    07-09-2017 20:33    44
1002    24-07-2017 09:43    55
1004    07-09-2017 20:33    66

输出应为:

rowno  ID         Date        Value Diff
1     1001  24-07-2017 09:43    10  N/A
2     1001  07-09-2017 20:33    11  1
1     1002  24-07-2017 09:43    11  N/A
2     1002  24-07-2017 09:43    55  44
1     1003  22-08-2017 21:42    10  n/A
2     1003  07-09-2017 20:33    44  34
1     1004  07-09-2017 20:33    66  N/A

1 个答案:

答案 0 :(得分:0)

您的日期不正确。按此栏目订购时,请先按天订购。正确的订购是年 - 月 - 日。使用正确的数据类型,日期时间或时间戳。为此,您可以执行以下操作:

alter table table1 add column d datetime;
update table1 set d = str_to_date(`Date`, '%d-%m-%Y %H:%i');
alter table table1 drop column `Date`;

获得所需结果的查询是:

SELECT ID, d, Value,
       IF(@ID=ID, Value - @prevV, 'N/A') AS diff,
       @row_number:=CASE WHEN @ID=ID THEN @row_number+1 ELSE 1 END AS row_number,

       @prevV := Value,
       @ID:=ID AS ID
FROM table1
, (SELECT @row_number:=0, @ID:='', @prevV := NULL) AS t 
ORDER BY id, d;

您所要做的就是添加另一个变量来保存上一行的值。