2013-07-03 2 views
1

я столкнулся с некоторыми трудностями, чтобы получить значение дельты:Обновление строки с разницей между текущей строкой и предыдущей строкой

id value delta 
1 929  928 
2 947  18 
3 950  21 
4 952  23 

Delta Колонок должен обновляться с той разницей между значения последовательного рядом из той же таблицы.

То есть, Во второй строке значение Delta должно быть [947 - 929]=18 В третьей строке значение Delta должно быть [950 - 947]=3 В четвертой строке значение Delta должно быть [952 - 950]=2 т.д.

По умолчанию всегда второй параметр. Вот почему это создает проблему. Я использовал следующий запрос. Есть ли проблемы с этим?

update table_name tt1 left outer JOIN table_name tt2 ON tt1.value>tt2.value set 
tt1.delta = (tt1.value-tt2.value); 
+0

Редактировать свой вопрос еще раз ... Выглядит немного странно форматирование – srahul07

ответ

0

Когда вы делаете несколько обновлений таблицы (и даже если это тот же стол, потому что вы используете его в качестве ссылки, это обновление мульти-таблицы) не вообще РЕГИСТРИРУЙТЕСЬ положение (согласно mysql здесь: http://dev.mysql.com/doc/refman/5.0/en/update.html).

Вы можете сделать что-то вроде этого:

UPDATE table_name tt1, table_name tt2 
SET tt1.delta = (tt1.value - tt2.value) 
WHERE 
tt2.id = (tt1.id + 1) 

Хорошая техника отладки, чтобы изменить UPDATE к SELECT, и убедитесь, что поля дельта, что вы хотите:

SELECT tt1.*, (tt1.value - tt2.value) AS delta 
FROM table_name tt1, table_name tt2 
WHERE 
tt2.id = (tt1.id + 1) 
0

Предполагая, что идентификатор действительно является инкрементальным (без пробелов)

SELECT x.* 
    , y.value-x.value delta 
    FROM my_table x 
    LEFT 
    JOIN my_table y 
    ON y.id = x.id + 1; 

... и подумайте, действительно ли есть какие-либо заслуживают хранения значений, которые могут быть легко получены из других значений.

0
Update T1 
SET T1.delta = Ta.value - T1.value 
FROM T1 
INNER JOIN T1 Ta ON T1.id + 1 = Ta.id 
0

Попробуйте этот запрос.

UPDATE TABLE_NAME T 
SET T.DELTA = (T.VALUE - (SELECT VALUE FROM TABLE_NAME WHERE ID = T.ID - 1)) 
WHERE T.ID > 1; 

Этот запрос должен работать, если в таблице есть запись для каждого ID, начиная с 2.

Этот запрос не будет обновлять первую запись.

0
update t t1 
set delta=value-coalesce((select value from 
        (select id,value from t) t2 
        where t2.id<t1.id 
        order by t2.id desc limit 1),1) 

SQL filddle demo

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