2016-08-06 3 views
5

У меня возникла проблема с использованием значения из предыдущей строки (я вроде бы не знаю, как это сделать).Использование значения из предыдущей строки

Я хочу сделать что-то вроде:

update test SET amount = (select amountAfter 
from rozl (Here i want to take it from previous row = this ID - 1) 

Я получил первичный ключ идентификатор, вся таблица сортируется по идентификатору. Что я хочу сделать:

Принять значение из предыдущей строки из суммы имени столбцаAfter и вставить ее в сумму в фактическом id.

Вот пример

id amount used destroyed amountAfter 
    1  100  50   30   20 
    2  20  5   1   14 
+1

Посмотрите на функцию оконного 'LAG': https://msdn.microsoft.com/en-us/library/hh231256.aspx – Nicarus

ответ

3

Вот один вариант с использованием join предполагающие ваши id поля являются последовательными:

update t1 
set t1.amount = t2.amountafter 
from test t1 join 
    test t2 on t2.id = t1.id - 1 

Если вы используете 2012 или выше, рассмотрим использование lag:

with cte as (
    select id, amount, lag(amount) over (order by id) prevamount 
    from test 
    ) 
update cte 
set amount = prevamount 
where prevamount is not null 

И я предполагаю, чтобы быть полным, 2008 будет работать с row_number если цифры не являются последовательными (используя сочетание обоих подходов):

with cte as (
    select id, amount, row_number() over (order by id) rn 
    from test 
    ) 
update t1 
set t1.amount = t2.amount 
from cte t1 join 
    cte t2 on t2.rn = t1.rn - 1 
+0

Возможно, стоит отметить, что это зависит от того, что идентификаторы являются последовательными (отсутствует) – Nicarus

+0

@Nicarus - Хорошая точка. Отредактированный, возможно, я принимал это слишком буквально: «Здесь я хочу взять его из предыдущей строки = этот идентификатор - 1' – sgeddes

+0

@sgeddes Не могли бы вы дать мне какой-либо контакт с вами? У меня был еще один вопрос, возможно, ответ будет намного проще, поэтому я не хочу начинать новую тему без причины. – JustSomeNewbie

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