0

私はしばらくの間、このテーマについていくつかの調査を行ってきましたが、別のトピックに投稿された解決策のおかげで、この問題の解決に近づきました.

データ列の変更を取得しようとしています: 行(n) - 行(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 日の差は計算されません (残りの値は問題ありません)。毎月 1 日も同様です。

私の推測では、[and tt1.date-tt2.date=1] と何か関係があると思いますが、正確にはわかりません。

事前にご協力いただきありがとうございます。

4

3 に答える 3

0

これを試し てみるDATEDIFFと、2 つの日付の差が日ごとにわかります。

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

これは、01-31を区別しているためであり、そうではないため、0が得られます

そのため、月も守らなければなりません。

于 2013-07-14T15:46:34.147 に答える
0

推測の 1 つとして、日付は保存されておらず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 に答える