2013-07-14 6 views
0

Я занимаюсь некоторыми исследованиями по этому вопросу на некоторое время, и благодаря решению, опубликованному в другой теме, я вплотную подошел к решению этой проблемы.Вычисление различий с SQL

Я пытаюсь получить изменения в столбце данных: строка (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 

Как вы можете видеть, разница не рассчитывается в течение первого апреля (остальные значения просто прекрасны). То же самое происходит и с 1-го числа каждого месяца.

Я предполагаю, что есть что-то делать с [и tt1.date-tt2.date = 1], но я не могу понять, что именно.

Спасибо за вашу помощь заранее!

ответ

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; 
+1

Благодарим за решение. Он отлично работает, мне нужно было добавить «.». to tt2.amount, чтобы избежать синтаксической ошибки и изменить вычитание на tt2.amount - tt1.amount. – user2581135

+0

спасибо, я исправил ответ –

0

попробуйте DATEDIFF Это даст вам разницу между двумя датами по дням.

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

это потому, что вы differenting 01-31 и его не истинные вот почему вы получите 0

так что вы должны defference также месяц.

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)); 
+0

Спасибо за ваш ответ. Я протестировал запрос и могу подтвердить, что он работает отлично. – user2581135

Смежные вопросы