我已经对这个主题进行了一段时间的研究,并且由于在另一个主题中发布了解决方案,我接近解决了这个问题。
我试图在一列数据中获取更改:row(n) - row(n-1)
update Table tt1
left outer JOIN Table tt2
on tt1.name = tt2.name
and tt1.date-tt2.date=1
set tt1.delta = (tt1.amount-ifnull(tt2.amount, tt1.amount));
输出
Date | Value | Delta
2013-03-30| 38651 | 393
2013-03-31| 39035 | 384
2013-04-01| 39459 | 0
2013-04-02| 39806 | 347
正如您所看到的,差异不计算4月1日(其余值都很好)。同样的情况发生在每个月的第一天。
我的猜测是与[和tt1.date-tt2.date = 1]有关,但我无法弄明白究竟是什么。
提前感谢您的所有帮助!
答案 0 :(得分:0)
尝试DATEDIFF
这将为您提供两个日期之间的差异。
and DATEDIFF(tt1.date,tt2.date) =1
这是因为你与01-31不同而且这不正确就是为什么你得到0
因此你也应该在一个月内进行辩护。
答案 1 :(得分:0)
一个猜测是日期不会存储为date
,而是有一个时间组件。您可以使用date
或使用date()
转换为datediff()
来解决此问题:
update Table tt1 left outer JOIN
Table tt2
on tt1.name = tt2.name and datediff(tt1.date, tt2.date) = 1
set tt1.delta = (tt1.amount-ifnull(tt2.amount, tt1.amount));
答案 2 :(得分:0)
我对你的陈述做了一些修改......你的错误要么是处理日期的方式,要么是你处理delta的方式......
update Table tt1
left outer JOIN Table tt2
on tt1.name = tt2.name
and tt1.date = date_sub(tt2.date, interval 1 day)
set tt1.delta = case when tt2.amount is not null then tt1.amount - tt2.amount else -1 end;