これは、結合を使用してほとんど行うことができます。
select pkid, eqid, worker, queue, tprev.queue as newqueue
from t left outer join
t tprev
on t.pkid = tprev.pkid + 1
ただし、PkID = 1 の場合は NULL になります。したがって、これを次のように追加する必要があります。
select pkid, eqid, worker, queue, coalesce(tprev.queue, lastone.queue) as newqueue
from t left outer join
t tprev
on t.pkid = tprev.pkid + 1 cross join
(select top 1 queue from t order by pkid desc) as lastone
実際に更新したい場合は、これを update ステートメントに入れることができます。
update t
set queue = newqueue
from (select pkid, eqid, worker, queue,
coalesce(tprev.queue, lastone.queue) as newqueue
from t left outer join
t tprev
on t.pkid = tprev.pkid + 1 cross join
(select top 1 queue from t order by pkid desc) as lastone
) newt
where t.pkid = newt.pkid
主キーに穴が開いている可能性があることを認識しています。この場合、次のクエリから始めます。
select t.*, newQueue
from (select t.*,
(select top 1 queue from t t2 where t2.pkid < t.pkid order by t2.pkid desc
) as newQueue
from t
) t
更新ステートメント:
update t
set queue = newqueue
from (select pkid, eqid, worker, queue,
coalesce(Newqueue, lastone.queue) as newqueue
from (select t.*,
(select top 1 queue from t t2 where t2.pkid < t.pkid order by t2.pkid desc
) as newQueue
from t
) t cross join
(select top 1 queue from t order by pkid desc) as lastone
) newt
where t.pkid = newt.pkid