我有一张桌子如下图所示。我想做一个分区,然后减去同一列中的值以获得差异。
由于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
答案 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;
您所要做的就是添加另一个变量来保存上一行的值。