0

我已经对这个主题进行了一段时间的研究,并且感谢另一个主题中发布的解决方案,我接近解决了这个问题。

我正在尝试获取数据列中的更改: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 日的差异不计算(其余值都很好)。每个月的第一天也是如此。

我的猜测是与 [and tt1.date-tt2.date=1] 有关,但我无法弄清楚到底是什么。

提前感谢您的所有帮助!

4

3 回答 3

0

试试 DATEDIFF这个会给你按天计算两个日期之间的差异。

  and  DATEDIFF(tt1.date,tt2.date) =1 

这是因为你在区分 01-31 而这不是真的这就是你得到 0 的原因

所以你也应该推迟这个月。

于 2013-07-14T15:46:34.147 回答
0

一种猜测是日期没有存储为date时间分量,而是具有时间分量。您可以通过转换为dateusingdate()或 using来解决此问题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));
于 2013-07-14T15:46:55.020 回答
0

我对您的陈述进行了一些更改...您的错误在于您处理日期的方式或处理增量的方式...

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;
于 2013-07-14T15:50:09.587 回答