Если вы используете SQL Server 2005 или более позднюю версию, это может сделать это для вас. Преимущество в том, что это один запрос.
with T1(rn,row,id,value) as (
select
rank() over (
order by value,row,id
),
row,id,value
from T
), T2(rn,value) as (
select
row_number() over (
order by value desc
), value
from T
), T12(row,id,value,vnew) as (
select row,id,T1.value,T2.value
from T1 join T2 on T1.rn = T2.rn
)
update T12 set
value = vnew;
Я предположил, что столбец "value" изначально увеличивался, и вы хотите, чтобы он уменьшался, но я учел возможность совпадения двух последовательных значений, если (row, id) является ключом для таблицы.
Есть и другие возможности. Например, если (строка, id) является ключом, и вы хотите изменить порядок значений «значения» с любой позиции, в которой они находятся, на позицию «зеркала», вы можете сделать это:
with T1(rn,row,id,value) as (
select
rank() over (
order by row,id
),
row,id,value
from T
), T2(rn,value) as (
select
rank() over (
order by row desc,id desc
), value
from T
), T12(row,id,value,vnew) as (
select row,id,T1.value,T2.value
from T1 join T2 on T1.rn = T2.rn
)
update T12 set
value = vnew;
При правильных индексах это может быть относительно эффективным.